Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Jinjo
Дата сообщения: 23.01.2009 18:06
Господа, у меня такая проблема. У меня есть запакованный дистрибутив. Я его распаковываю! Открываю скрипт который лежит в корне и пытаюсь его заново скомпилировать и у меня выскакивает ошибка. Не хватает файлов.

Скажите, это нормальная практика, что файл-скрипт не может быть скомпилирован?
Если нужно более подробно рассказать, то расскажу.

Автор: SotM
Дата сообщения: 23.01.2009 22:30
Jinjo
Ну тут среди нас нет телепатов, которые смогут определить, что у тебя за ошибка и как тебе помочь.

Serega0675
Что значит задать кодировку?! Как создается текстовой файл?
Нужно лучше описывать проблему/задание, чтобы проще было понимать.

cleverboy
Ты этот пример из самого редактора шоли запускаешь? Запусти его отдельно и сравни скорость.
Автор: Serega0675
Дата сообщения: 23.01.2009 23:07
SotM
Извиняюсь за неточность, вот [more=пример][Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssDone then
begin
SaveStringToFile(ExpandConstant('{app}')+'\main.nfo', 'текст.....' + #13, true);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}\main.nfo'));
end;
end;
[/more]. Если открыть этот файл после создания в блокноте AkelPad, то он будет в кодировке Mac (0Dh). Вопрос как сделать, чтоб он был после создания в кодировке DOS/Windows (0Dh , 0Ah)?
Автор: Jinjo
Дата сообщения: 24.01.2009 08:34
SotM
у меня вот такая ошибка

на вот эту строчку
Name: "{group}\Дополнительно\Установка службы параметров"; Filename: "{app}\ServParam.exe"; Parameters: "/install"; Components: "client"; Check: "CheckInstallParameter(1)";

Ошибку пишет
Required fuction or Procedure CheckInstallParameter not found
Автор: Diawer
Дата сообщения: 24.01.2009 09:23
Решил использовать Бэкап и остановился на вот этом[more= коде];из ”Руководство по расширенным возможностям Inno Setup 5 (не для чайников) от Kindly Версия 5.1“

#include "SHFileOperation.iss"

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Tasks]
Name: src; Description: "Backup"

[Files]
Source: "C:\util\*"; DestDir: {app}; BeforeInstall: CreateBackup; Flags: ignoreversion recursesubdirs createallsubdirs

[Code]
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;[/more], но у меня возникла проблема с [more= кодом][Setup]
AppName=My Program
AppVerName=My Program 1.2
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Icons]
Name: {userdesktop}\My Program; Filename: {app}\My Program.exe; Check: MakeDesktopIcon

[Code]
var
DesktopIcon: TCheckBox;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;
end;

procedure InitializeWizard();
begin
DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Create a desktop icon';
Left := WizardForm.DirEdit.Left;
Top := WizardForm.DirEdit.Top + 35;
Width := WizardForm.DirEdit.Left + WizardForm.DirEdit.Width;
Height := ScaleY(13);
TabOrder := 0;
Checked := True;
end;
end;[/more] который я также использую - а именно Чекбокс на странице Выбор директории, как запустить Бэкап через стандартный Чекбокс на странице выбора дополнительных задач - ясно, но в моем Инсталлере ее нет. Как прикрутить Бэкап к Чекбоксу (код). Есть такая строка if IsTaskSelected('src') then, но заменить не получилось.
Автор: Don_Juan
Дата сообщения: 24.01.2009 11:17
Diawer

Если я правильно понял, то так:

[more=Подробнее..][Setup]
AppName=My Program
AppVerName=My Program 1.2
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Icons]
Name: {userdesktop}\My Program; Filename: {app}\My Program.exe; Check: MakeDesktopIcon

[Code]
var
DesktopIcon, CreateBackupFlises: TCheckBox;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;
end;

function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure InitializeWizard();
begin
DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Create a desktop icon';
Left := WizardForm.DirEdit.Left;
Top := WizardForm.DirEdit.Top + 35;
Width := WizardForm.DirEdit.Left + WizardForm.DirEdit.Width;
Height := ScaleY(13);
TabOrder := 0;
Checked := True;
end;
CreateBackupFlises := TCheckBox.Create(WizardForm);
with CreateBackupFlises do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Create backup files';
Left := WizardForm.DirEdit.Left;
Top := DesktopIcon.Top + 25;
Width := WizardForm.DirEdit.Left + WizardForm.DirEdit.Width;
Height := ScaleY(13);
TabOrder := 0;
Checked := True;
end;
end;

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if CreateBackupFlises.Checked then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;[/more]
Автор: cleverboy
Дата сообщения: 24.01.2009 11:38
SotM

Цитата:
Ты этот пример из самого редактора шоли запускаешь? Запусти его отдельно и сравни скорость.

Я сделал setup для одной игрушки и смотрел то что получилось в итоге.
[more=Код здесь]
Вот код:

Код:
[Code]
const
Indent=25;

type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
BackImage, SlideImage: TBitmapImage;
TimerID: LongWord;
s:string;
Width, Height:Integer;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';
function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';
function mciSendString(lpstrCommand: string; lpstrReturnString: string; uReturnLength:integer; hwndCallback:integer):integer;
external 'mciSendStringA@winmm.dll stdcall';

procedure InitializeWizard();
begin
WizardForm.Position:=poScreenCenter
Width:=GetSystemMetrics(0)
Height:=GetSystemMetrics(1)
MainForm.BORDERSTYLE:=bsNone
MainForm.Left:=0
MainForm.Top:=0
MainForm.Width:=Width
MainForm.Height:=Height
ExtractTemporaryFile('Фон.bmp')
s:=ExpandConstant('{tmp}')+'\Фон.bmp '
BackImage:=TBitmapImage.Create(MainForm)
BackImage.Bitmap.LoadFromFile(s)
BackImage.Align:=alClient
BackImage.Parent:=MainForm
BackImage.Stretch:=True
MainForm.Visible:=True

ExtractTemporaryFile('Фон.bmp')
ExtractTemporaryFile('1.bmp')
ExtractTemporaryFile('2.bmp')
ExtractTemporaryFile('3.bmp')
ExtractTemporaryFile('4.bmp')
ExtractTemporaryFile('5.bmp')
ExtractTemporaryFile('6.bmp')
ExtractTemporaryFile('7.bmp')
ExtractTemporaryFile('8.bmp')
ExtractTemporaryFile('9.bmp')
ExtractTemporaryFile('10.bmp')

ExtractTemporaryFile(ExpandConstant('potc.mp3'))
mciSendString(ExpandConstant('play {tmp}\potc.mp3 repeat'),'NULL',0,0)
end;

function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
percent: integer;
begin
percent:=PercentProgress
with SlideImage do begin
if ((percent>0) and (percent<10) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\1.bmp')
Tag:=1
end else
if ((percent>11) and (percent<20) and (Tag<>2)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\2.bmp')
Tag:=2
end else
if ((percent>21) and (percent<30) and (Tag<>3)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\3.bmp')
Tag:=3
end else
if ((percent>31) and (percent<40) and (Tag<>4)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\4.bmp')
Tag:=4
end else
if ((percent>41) and (percent<50) and (Tag<>5)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\5.bmp')
Tag:=5
end else
if ((percent>51) and (percent<60) and (Tag<>6)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\6.bmp')
Tag:=6
end else
if ((percent>61) and (percent<70) and (Tag<>7)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\7.bmp')
Tag:=7
end else
if ((percent>71) and (percent<80) and (Tag<>8)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\8.bmp')
Tag:=8
end else
if ((percent>81) and (percent<90) and (Tag<>9)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\9.bmp')
Tag:=9
end else
if ((percent>91) and (percent<100) and (Tag<>10)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\10.bmp')
Tag:=10
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
Width, Height: Integer;
begin
If CurPageID=wpInstalling
then
begin
WizardForm.CancelButton.BringToFront;
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)
SlideImage:=TBitmapImage.Create(MainForm)
with SlideImage do begin
Stretch:=True
Align:=alClient
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\1.bmp')
Parent:=MainForm
Tag:=1
end
end
if CurPageID=wpFinished
then
begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
SlideImage.Hide
end
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;
Автор: SotM
Дата сообщения: 24.01.2009 16:33
Serega0675
Насчет редакторов это оффтопик, но можешь в соседних форумах глянуть редактор SciTE.

Jinjo
Нууу, эээ... Как тебе и сказал компилятор, у тебя нет функции с таким именем. Смотри свой код.
Автор: Serega0675
Дата сообщения: 24.01.2009 21:49
SotM
Спасибо, но я имел ввиду программно, т.е. при создании... Ничего умней не придумал, вот [more=решение][Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssDone then
begin
SaveStringToFile(ExpandConstant('{app}\main.nfo'), 'текст.....' + #13, true);
SetIniString('Section', 'a', '', ExpandConstant('{app}\main.nfo'));
DeleteIniSection('Section', ExpandConstant('{app}\main.nfo'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}\main.nfo'));
end;
end;
[/more] , вполне возможно, что это не совсем правильно, но я добился желаемого результата...
Фишка в том, что при создании файла .ini он создаётся в кодировке DOS/Windows (0Dh , 0Ah), а при других расширениях Mac (0Dh). Поэтому и добавил SetIniString, т.е. именно при такой последовательности и получаю требуемую кодировку...

Добавлено:
Накидал для себя тихий [more=инсталлятор]#define DateTime GetDateTimeString('dd/mm/yyyy года, в hh:nn:ss ', '.', ':')

[Setup]
AppName=BuildScript
AppVerName=BuildScript
VersionInfoDescription=BuildScript
DisableProgramGroupPage=yes
DisableFinishedPage=yes
DisableReadyPage=yes
CreateUninstallRegKey=no
CreateAppDir=no
Uninstallable=no
OutputBaseFilename=BuildScript
OutputDir=.
SolidCompression=yes
Compression=lzma/ultra
InternalCompressLevel=ultra

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;

procedure install_script();
var
ScriptName,str: string;
ResultCode: Integer;
begin
CreateDir(ExpandConstant('{userdocs}\Inno Setup Examples Output'));
ScriptName:= ExpandConstant('{userdocs}\Inno Setup Examples Output\install_script.iss');
str:= str+ '; Данный скрипт создан с помощью Мастера - ' + ExpandConstant('{#DateTime}') + #13 +
str+ '' + #13 +
str+ '[Setup]' + #13 +
str+ 'AppName=My Program' + #13 +
str+ 'AppVerName=My Program v 1.5' + #13 +
str+ 'DefaultDirName={pf}\My Program' + #13 +
str+ 'OutputDir=.' + #13 +
str+ 'Compression=lzma/ultra' + #13 +
str+ 'InternalCompressLevel=ultra' + #13 +
str+ 'SolidCompression=yes' + #13#13 +
str+ '[Code]' + #13;
SaveStringToFile(ScriptName, str, False);
ShellExec('open', ScriptName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
install_script();
end;
[/more], для создания болванок скриптов.
Вопрос, как сделать если файл install_script.iss уже существует, то создать install_script1.iss и так далее?
Автор: htuos
Дата сообщения: 25.01.2009 12:31
Serega0675

Цитата:
Вопрос, как сделать если файл install_script.iss уже существует, то создать install_script1.iss и так далее?


отсюда возьми
[more][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Code]
type
TThreadEntry32 = record
dwSize: DWORD;
cntUsage: DWORD;
th32ThreadID: DWORD;
th32OwnerProcessID: DWORD;
tpBasePri: Longint;
tpDeltaPri: Longint;
dwFlags: DWORD;
end;

TGUIThreadinfo = record
cbSize: DWORD;
flags: DWORD;
hwndActive: HWND;
hwndFocus: HWND;
hwndCapture: HWND;
hwndMenuOwner: HWND;
hwndMoveSize: HWND;
hwndCaret: HWND;
rcCaret: TRect;
end;

function GetCurrentProcessId: DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Thread32First(hSnapshot: THandle; var lpte: TThreadEntry32): BOOL; external 'Thread32First@kernel32.dll stdcall';
function Thread32Next(hSnapshot: THandle; var lpte: TThreadENtry32): BOOL; external 'Thread32Next@kernel32.dll stdcall';
function GetGUIThreadInfo (idThread: DWORD; var pgui: TGUIThreadinfo): BOOL; external 'GetGUIThreadInfo@user32.dll stdcall';
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

function GetCountThread(PID:Cardinal;HideWindow:boolean):integer;
var
hSnapshot:THandle;
lppe:TThreadEntry32;
GUIThreadInfo:TGUIThreadInfo;
begin
Result:=0;
// Делаем снимок
hSnapshot:=CreateToolhelp32Snapshot($00000004,0);
if hSnapshot=0 then Exit;
lppe.dwSize:=SizeOf(lppe);
GUIThreadinfo.cbSize:=SizeOf(GUIThreadinfo);
// Ищем потоки в системе
if Thread32First(hSnapshot,lppe) then
repeat
// Проверяем принадлежность потока к процессу
if PID=lppe.th32OwnerProcessID then begin
Result:=Result+1;
//чтобы найти окна потока нужно использовать EnumThreadWindows -
//при этом нужно использовать callback-функцию, т.е. еще одну длл (innocallback.dll) тащить,
//что не приемлимо по условию задачи (да и не факт, что это помогло бы при таком подходе скрытия окна)
//поэтому пробуем очередной извращенский способ
//опять же условности, на медленной машине (или наоборот на быстрой?) окно может успеть появиться
//у меня при sleep(200) его не заметно в delphi, а в инно видно как окно появляется
//пришлось поставить sleep(1), при этом процессор не загружается (у меня по крайней мере так, для инфы проц Core 2 Duo E8400)

//тут надо подумать как не выполнять поиск окон постоянно, если окно уже скрыто.
//пробовал запоминать хэндл скрываемого окна - не помогло, больше никаких мыслей не текущий момент

//если у потока есть окно, то скрываем его
if (Result>1) and HideWindow then //в инно, как и в обычном VCL-приложении, всего один поток, по крайней мере до начала основной распаковки файлов
if GetGUIThreadInfo(lppe.th32ThreadID,GUIThreadInfo) then
if (GUIThreadInfo.hwndActive>0) then ShowWindow(GUIThreadInfo.hwndActive,SW_HIDE);
//в кратце - получаем хэндл активного окна найденного потока для нашего процесса, если таковое существует, и скрываем его
end;
until not Thread32Next(hSnapshot,lppe);
CloseHandle(hSnapshot);
end;

function GetFileName(name:string;n:integer):string;
//возвращает новое имя файла, если заданный файл уже существует
//в итоге получаем, если name='c:\test.zip'
//c:\test.zip
//c:\test[1].zip
//c:\test[2].zip
//c:\test[3].zip
//. . .
//c:\test[n].zip
var
s,e:string;
p:integer;
begin
Result:=name;
if FileExists(name) then begin
s:=ExtractFileName(name);
e:=ExtractFileExt(name);
s:=Copy(s,1,Length(s)-(Length(e)));
p:=Pos('[',s);
if p>0 then s:=Copy(s,1,p-1);
s:=AddBackslash(ExtractFileDir(name))+s+'['+IntToStr(n+1)+']'+e;
Result:=GetFileName(s,n+1);
end;
end;

procedure Zip(const aSrc,aDst:string;WaitingArcProcess:boolean;SilentMode:boolean);
//если WaitingArcProcess=False, то SilentMode игнорируется (т.е. окно упаковщика видно)
var
sh,srcFolder,dstFolder:Variant;
PID:Cardinal;
ZipStr:string;
i:integer;
begin
ZipStr:=Chr($50)+Chr($4B)+Chr($05)+Chr($06);
for i:=0 to 17 do ZipStr:=ZipStr+#0;
ForceDirectories(ExtractFileDir(aDst));
SaveStringToFile(aDst,ZipStr,False);

sh:=CreateOleObject('Shell.Application');
try
dstfolder:=sh.NameSpace(aDst);
PID:=GetCurrentProcessID;
if DirExists(aSrc) then begin
srcFolder:=sh.NameSpace(aSrc);
dstfolder.CopyHere(srcFolder.Items,0);
end else dstfolder.CopyHere(aSrc,0);
if WaitingArcProcess then
while (GetCountThread(PID,SilentMode)>1) do Sleep(1);
//ф-ция GetCountThread вроде быстро выполняется
//а вот Sleep(1) - дебилизм, и все равно никаких гарантий, что окно упаковщика не промелькнет

// как получить хэндл потока (hThread)? чтобы использовать
// WaitForSingleObject(hThread,200); вместо Sleep(500); есть подозрение, что никак
// и по уму надо получить все идентификаторы потоков до начала CopyHere и после
// и использовать тогда WaitForMultipleObject для новых потоков
// правда опять же есть еще одно подозрение, что copyhere создает не один поток,
// и создает потоки не сразу, а через неравные промежутки времени, поэтому наверное лучше как сейчас написано
// или может у тебя какие идеи появятся
MsgBox('Готово', mbInformation, mb_Ok);
//еще один дебильный способ, может подойти только для создания нового zip'a
//для распаковки он наверное не годится, хотя если подумать ...
//можно не думать и для распаковки сойдет, только придется сосчитать сколько в директории назначения было файлов до распаковки/копирования
// i:=shell.NameSpace(aSrc).Items.Count;
// repeat
// Sleep(200);
// until i=shell.NameSpace(aDst).Items.Count
finally
srcFolder:=Unassigned;
dstfolder:=Unassigned;
sh:=Unassigned;
end;
end;

procedure InitializeWizard();
begin
Zip('f:\Films\1-OCCULT-ZS\Fixed1-OCCULT-ZS.avi',GetFileName('e:\test.zip',0),True,True);
end;[/more] там отдельная функция
остальное не удалял, может кому интересно будет архивирование (zip) без сторонних длл. дополненный способ от Genri
Автор: Sid007
Дата сообщения: 25.01.2009 17:10
Народ, а можно как скрыть в окне выбора компонента установки, его размер. Я использую 2 кнопки типа exclusive. Это патч для игры, там версии 1.0 и 1.1, поэтому нет смысла видеть какой объем каждый из них требует. Заранее спасиба.

Автор: Serega0675
Дата сообщения: 25.01.2009 18:39
htuos
Спасибо, но чего-то у меня не получается, то выдаёт ошибки, то зацикливается и начинает создавать кучу файлов... Можете написать пример применимо к моему случаю...

Sid007

Цитата:
а можно как скрыть в окне выбора компонента установки, его размер

Я же вам писал в примере
[Messages]
ComponentSize1=

А если вы имеете ввиду размер компонентов, который отображается внизу страницы, то
[Messages]
ComponentsDiskSpaceMBLabel=
Автор: htuos
Дата сообщения: 25.01.2009 20:37

Цитата:
htuos
Спасибо, но чего-то у меня не получается, то выдаёт ошибки, то зацикливается и начинает создавать кучу файлов... Можете написать пример применимо к моему случаю...

[more=как то так]#define DateTime GetDateTimeString('dd/mm/yyyy года, в hh:nn:ss ', '.', ':')

[Setup]
AppName=BuildScript
AppVerName=BuildScript
VersionInfoDescription=BuildScript
DisableProgramGroupPage=yes
DisableFinishedPage=yes
DisableReadyPage=yes
CreateUninstallRegKey=no
CreateAppDir=no
Uninstallable=no
OutputBaseFilename=BuildScript
OutputDir=.
SolidCompression=yes
Compression=lzma/ultra
InternalCompressLevel=ultra

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;

function GetFileName(name:string;n:integer):string;
var
s,e:string;
p:integer;
begin
Result:=name;
if FileExists(name) then begin
s:=ExtractFileName(name);
e:=ExtractFileExt(name);
s:=Copy(s,1,Length(s)-(Length(e)));
p:=Pos('[',s);
if p>0 then s:=Copy(s,1,p-1);
s:=AddBackslash(ExtractFileDir(name))+s+'['+IntToStr(n+1)+']'+e;
Result:=GetFileName(s,n+1);
end;
end;

procedure install_script();
var
ScriptName,str,fn: string;
ResultCode: Integer;
begin
CreateDir(ExpandConstant('{userdocs}\Inno Setup Examples Output'));
ScriptName:= GetFileName(ExpandConstant('{userdocs}\Inno Setup Examples Output\install_script.iss'),0);
str:= str+ '; Данный скрипт создан с помощью Мастера - ' + ExpandConstant('{#DateTime}') + #13 +
str+ '' + #13 +
str+ '[Setup]' + #13 +
str+ 'AppName=My Program' + #13 +
str+ 'AppVerName=My Program v 1.5' + #13 +
str+ 'DefaultDirName={pf}\My Program' + #13 +
str+ 'OutputDir=.' + #13 +
str+ 'Compression=lzma/ultra' + #13 +
str+ 'InternalCompressLevel=ultra' + #13 +
str+ 'SolidCompression=yes' + #13#13 +
str+ '[Code]' + #13;
SaveStringToFile(ScriptName, str, False);
ShellExec('open', ScriptName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
install_script();
end;
[/more] что-то я раньше этого глюка не замечал, правда этот скрипт практически не тестировался
Автор: Serega0675
Дата сообщения: 25.01.2009 21:00
htuos
Большое спасибо, всё работает!!!
Понял где делал ошибку...
СПАСИБО!!!
Автор: Sid007
Дата сообщения: 25.01.2009 23:51
Serega0675
Я стормозил. Просто пробовал 4 варианта, запутался окончательно, и в итоге пришел снова к 1 варианту. Спасибо что не послали... ) на другую страницу. Благодарю за ответ!!!
Автор: stNeko
Дата сообщения: 26.01.2009 03:37
Вот известный кусок кода закрытия запущенного приложения:

[more]function InitializeSetup(): Boolean;

begin
If RunTask('file.exe', false) then
begin
if MsgBox(ExpandConstant('{cm:TaskRun}'), mbError, mb_OkCancel) = idOk then
begin
KillTask('file.exe');
UnloadDLL(ExpandConstant('ISTask.dll'));
sleep (500)
Result:= True;
end else
Exit;
end;
Result:=True;
end;[/more]


Нужно сделать так: если обнаружен запущенный file.exe, то выдаётся окно с просьбой закрыть приложение. В этом окне две кнопки, если нажать ОК не закрыв приложения, то повторно выскакивает это же предупреждение, если нажать после закрытия приложения - начинается установка. Вторая кнопка - выход.

Я не могу сообразить, как быть с кнопкой ОК, чтоб зациклить процесс проверки процесса и выдачи предупреждения... получалось только, что через пару нажатий ОК при запущенном приложении установка всё равно продолжалась.
Автор: LordVeider
Дата сообщения: 26.01.2009 05:08
stNeko
[more=А если вот так ?]function InitializeSetup(): Boolean;

begin
while RunTask('file.exe', false) do
begin
if MsgBox(ExpandConstant('{cm:TaskRun}'), mbError, mb_OkCancel) = idOk then
sleep (500)
else
Exit;
end;
Result:=True;
end;[/more]
Автор: stNeko
Дата сообщения: 26.01.2009 13:00
LordVeider, именно так (:
Автор: viktor9
Дата сообщения: 26.01.2009 13:09
Ребята помогите с этим кодом ругаеться вовремя установки
Runtime Erorr (at 1:109):
Не удается найти указаный файл


Цитата:
Те, кто из вас пользуется русификаторами, должны встречаться с патчером-инсталлятором PatchWise Free. При желании русифицировать не ту версию программы в нем перед началом обновления появляется сообщение о несоответствии целостности и на этом установка завершается. Что ж, попробуем сделать также. Inno не имеет функции для проверки CRC, но имеет функцию для проверки MD5 хеша, что на мой взгляд лучше CRC.

[more]
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName=C:\My Program
OutputBaseFilename=setup
Compression=lzma
WindowVisible=yes
WindowShowCaption=no

[Files]
Source: C:\File.exe; DestDir: {app}\File.exe

[Code]
//Не забываем вставить порверку на присутствие проверяемого файла
procedure CurStepChanged(CurStep: TSetupStep);
var
MD5,s:string;
begin
If CurStep=ssInstall
then
begin
MD5 := GetMD5OfFile(ExpandConstant('{app}\File.exe'));
If not (MD5 = '86a1311d51c00b278cb7f27796ea442e') then
begin
s:='Ошибка MD5 в File.exe!' #13#13 'Обновление прекращено.';
MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.
WizardForm.Close; //Закрытие инсталлятора
Exit; //Прерывание и откат всех действий
end;
end;
end;

//Не забываем дописать еще такую процедуру
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=True;
If CurPage=12 //Это непосредственно страница с индикатором выполнения
then
begin
Confirm:=False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена
end;
end;
[/more]
Автор: Serega0675
Дата сообщения: 26.01.2009 14:23
viktor9
Инсталлятор ругается, на то, что не может посчитать MD5, файла то в папке нет... Поэтому добавьте проверку на присутствие файла, [more=подробнее]
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName=C:\My Program
OutputBaseFilename=setup
Compression=lzma
WindowVisible=yes
WindowShowCaption=no

[Files]
Source: C:\File.exe; DestDir: {app}

[Code]
// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
If (FileSearch('File.exe', ExpandConstant('{app}'))='') then
begin
s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружен файл, подтверждающий подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
MsgBox(s, mbError, mb_Ok);
Result:= False
end;
end;
end;

//Не забываем вставить порверку на присутствие проверяемого файла
procedure CurStepChanged(CurStep: TSetupStep);
var
MD5,s:string;
begin
If CurStep=ssInstall
then
begin
MD5 := GetMD5OfFile(ExpandConstant('{app}\File.exe'));
If not (MD5 = '86a1311d51c00b278cb7f27796ea442e') then
begin
s:='Ошибка MD5 в File.exe!' #13#13 'Обновление прекращено.';
MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.
WizardForm.Close; //Закрытие инсталлятора
Exit; //Прерывание и откат всех действий
end;
end;
end;

//Не забываем дописать еще такую процедуру
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=True;
If CurPage=12 //Это непосредственно страница с индикатором выполнения
then
begin
Confirm:=False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена
end;
end;
[/more]
Автор: paul_smART
Дата сообщения: 26.01.2009 15:37
приветствую всех
Господа подскажите как сделать инсталлер для драйвера FStarForce
Автор: SergeyLS
Дата сообщения: 26.01.2009 16:12
Привет всем!
Не подскажете ли мне - такую штуку?
Я попытался включить в свой инсталлятор следующий код:
[more]
Код:
procedure InitializeWizard();
begin
//Переносим кнопку "Отмена" на передний план
WizardForm.CancelButton.BringToFront;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling
then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel.Visible:=False;
WizardForm.Width:=ScaleX(395); //Длина переносимого главного окна индикатора установки.
WizardForm.Height:=ScaleY(142); //Высота переносимого главного окна индикатора установки.

//Здесь смещение страницы установки (в верхний левый угол)
WizardForm.Left:=ScaleX(0);
WizardForm.Top:=ScaleY(0);

// WizardForm.Left:=ScaleX(MainForm.Left+20); // Выводит в нижнем углу
// WizardForm.Top:=ScaleY(MainForm.Height-170); // Выводит в левом углу

WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 6;
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height) div 7 * 6;

WizardForm.InnerNotebook.Left:=ScaleX(10); //Отступ от левого края, в главном окне индикатора установки, самого индикатора установки.
WizardForm.InnerNotebook.Top:=ScaleY(10); //Отступ от верхнего края, в главном окне индикатора установки, самого индикатора установки (Вместе с кнопкой //Отмена).
WizardForm.InnerNotebook.Width:=ScaleX(370); //Длина индикатора установки
WizardForm.StatusLabel.Left:=ScaleX(0); //Отступ слева в главном окне, индикатора установки, пояснений: распаковка файлов (верхняя строка).
WizardForm.StatusLabel.Top:=ScaleY(0); //Отступ сверху в главном окне, индикатора установки, пояснений: распаковка файлов (верхняя строка).
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0); //Отступ слева в главном окне, индикатора установки, пояснений: путь распаковки файлов (верхняя строка).
WizardForm.FileNameLabel.Top:=ScaleY(20); //Отступ сверху в главном окне, индикатора установки, пояснений: путь распаковки файлов (верхняя строка).
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(38); //Отступ от верхнего края, в главном окне индикатора установки, самого индикатора установки.
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154); //Отступ слева кнопки: Отмена.
WizardForm.CancelButton.Top:=ScaleY(80); //Отступ сверху кнопки: Отмена.
end;
if CurPageID=wpFinished then
// if CurPageID=wpInfoAfter then
begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Bevel.Visible:=True;
WizardForm.Visible:=True;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;

end;
end;
Автор: naben
Дата сообщения: 26.01.2009 22:20
Подскажите плиз, как сделать поиск определённого текста и его замену на нужный текст в нескольких текстовых файлах.
Попробовал такой код:

Код: procedure erer(Sender:TObject);
var x:TStrings;
begin
x:=TStringList.Create;
x.LoadFromFile('твой_текстовый_файл.txt');
x.Text:=AnsiReplaceStr(x.Text,Edit1.Text,'');
x.SaveToFile('твой_текстовый_файл.txt');
x.Free;
end;
Автор: Unc1e
Дата сообщения: 27.01.2009 11:55
paul_smART
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1080#4
Автор: Diawer
Дата сообщения: 27.01.2009 13:28
Don_Juan

Цитата:
Как прикрутить Бэкап к Чекбоксу (код).

Спасибо, то самое.
Автор: LouisVuitton
Дата сообщения: 27.01.2009 19:23
Добрый всем день. Подскажите, пожалуйста, реально ли сделать что бы здесь



текст был без фона, то есть поверх картинки. с помощью поиска нашел пару подобных вопросов и было сказано что инно не поддерживает transparent, но прошло много времени, может появились какие-то новые способы?

спасибо
Автор: LordVeider
Дата сообщения: 27.01.2009 21:29
С помощью ISTask можно прибить процесс.
А что делать, если нужно корректно завершить работу приложения ?
Автор: de_MAX
Дата сообщения: 28.01.2009 11:20
Подскажите такую вещь:
нужно распаковать .exe-файлы в темп и оттуда запустить (апдейты винды), я не знаю какие параметры выставить в секции [Code] для запуска.
Вот эти параметры для командной строки :

/Q /O /N /Z
/wuforce /quiet /norestart
-override 1 /I MsDrmClient.msi REBOOT=ReallySuppress /q -override 2 /I RmClientBackCompat.msi REBOOT=ReallySuppress /q


Ну вот впринципе весь [more=батник]@echo off
ECHO.
ECHO Installing Hotfixes for Microsoft Windows XP SP3
ECHO --------------------------------------------------------------------------
ECHO 01 -KB942288 02.06.08 Windows Installer 4.5 Redistributable
start /wait .\Update08\WindowsXP-KB942288-v3-x86.exe /Q /O /N /Z
ECHO 02 -WU.v7 17.10.08 WindowsUpdateAgent30 v.7.2.6001.788
start /wait .\Update08\windowsupdateagent30-x86.exe /wuforce /quiet /norestart
ECHO 03 -KB898461 27.06.05 устанавливает постоянную копию установщика пакетов
start /wait .\Update08\WindowsXP-KB898461-x86-RUS.exe /Q /O /N /Z
ECHO 04 -KB909520 29.11.05 Базовый поставщик службы криптографии для смарт-карт
start /wait .\Update08\Windows-KB909520-v1.000-x86-RUS.exe /Q /O /N /Z
ECHO 05 -KB917275 22.11.06 Клиент управления правами Microsoft Windows
start /wait .\Update08\WindowsRightsManagementServicesSP2-KB917275-Client-RUS-x86.exe -override 1 /I MsDrmClient.msi REBOOT=ReallySuppress /q -override 2 /I RmClientBackCompat.msi REBOOT=ReallySuppress /q
ECHO 06 -KB952287 12.05.08 потеря данных при использовании компонентов (MDAC)
start /wait .\Update08\WindowsXP-KB952287-x86-RUS.exe /Q /O /N /Z
ECHO 07 -KB944043 26.05.08 Обновление для Windows XP
start /wait .\Update08\WindowsXP-KB944043-v3-x86-RUS.exe /Q /O /N /Z
ECHO 08 -KB951830 26.05.08 клиент не может разрешить DNS
start /wait .\Update08\WindowsXP-KB951830-x86-RUS.exe /Q /O /N /Z
ECHO 09 -KB950762 10.06.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB950762-x86-RUS.exe /Q /O /N /Z
ECHO 10 -KB951698 10.06.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB951698-x86-RUS.exe /Q /O /N /Z
ECHO 11 -KB951376 19.06.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB951376-v2-x86-RUS.exe /Q /O /N /Z
ECHO 12 -KB951748 07.07.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB951748-x86-RUS.exe /Q /O /N /Z
ECHO 13 -KB951978 08.07.08 ошибка в сценариях VBScript/JScript
start /wait .\Update08\WindowsXP-KB951978-x86-RUS.exe /Q /O /N /Z
ECHO 14 -KB946648 11.08.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB946648-x86-RUS.exe /Q /O /N /Z
ECHO 15 -KB950582 11.08.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB950582-x86-RUS.exe /Q /O /N /Z
ECHO 16 -KB950974 11.08.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB950974-x86-RUS.exe /Q /O /N /Z
ECHO 17 -KB951066 11.08.08 Обновление системы безопасности Outlook Express
start /wait .\Update08\WindowsXP-KB951066-x86-RUS.exe /Q /O /N /Z
ECHO 18 -KB952954 11.08.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB952954-x86-RUS.exe /Q /O /N /Z
ECHO 19 -KB951618 19.08.08 проблема совместимости с драйвером Safnt.sys
start /wait .\Update08\WindowsXP-KB951618-v2-x86-RUS.exe /Q /O /N /Z
ECHO 20 -KB954708 25.08.08 сохранять метаданные XMP со сложными типами данных
start /wait .\Update08\WindowsXP-KB954708-x86-RUS.exe /Q /O /N /Z
ECHO 21 -KB938464 08.09.08 нарушить защиту компьютера использующей GDI+
start /wait .\Update08\WindowsXP-KB938464-x86-RUS.exe /Q /O /N /Z
ECHO 22 -KB953155 13.10.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB953155-x86-RUS.exe /Q /O /N /Z
ECHO 23 -KB956841 13.10.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB956841-x86-RUS.exe /Q /O /N /Z
ECHO 24 -KB956391 14.10.08 Обновление системы безопасности для ActiveX Killbits
start /wait .\Update08\WindowsXP-KB956391-x86-RUS.exe /Q /O /N /Z
ECHO 25 -KB958644 22.10.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB958644-x86-RUS.exe /Q /O /N /Z
ECHO 26 -KB959252 04.11.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB959252-x86-RUS.exe /Q /O /N /Z
ECHO 27 -KB954430 10.11.08 Обновление системы безопасности для MSXML 4.0 SP2
start /wait .\Update08\msxml4-KB954430-enu.exe /Q
ECHO 28 -KB954459 10.11.08 Обновление системы безопасности для MSXML 6.0
start /wait .\Update08\WindowsXP-KB954459-x86-RUS.exe /Q /O /N /Z
ECHO 29 -KB955069 10.11.08 Обновление системы безопасности для MSXML 3.0
start /wait .\Update08\WindowsXP-KB955069-x86-RUS.exe /Q /O /N /Z
ECHO 30 -KB957097 10.11.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB957097-x86-RUS.exe /Q /O /N /Z
ECHO 31 -KB931125 24.11.08 Обновление корневых сертификатов
start /wait .\Update08\rootsupd.exe /Q
ECHO 32 -KB958752 24.11.08 Совместимость двоичного файла afd.sys
start /wait .\Update08\WindowsXP-KB958752-x86-RUS.exe /Q /O /N /Z
ECHO 33 -KB958655 24.11.08 Обновление для Windows Installer 4.5
start /wait .\Update08\WindowsXP-KB958655-x86-ENU.exe /Q /O /N /Z
ECHO 34 -KB955839 24.11.08 Автоматически перевести системные часы в 2008 г
start /wait .\Update08\WindowsXP-KB955839-x86-RUS.exe /Q /O /N /Z
ECHO 35 -KB954600 05.12.08 Обновление безопасности для Windows Media Player 6.4
start /wait .\Update08\WindowsXP-KB954600-x86-RUS.exe /Q /O /N /Z
ECHO 36 -KB956802 05.12.08 Обновление системы безопасности для Windows XP
start /wait .\Update08\WindowsXP-KB956802-x86-RUS.exe /Q /O /N /Z
ECHO 37 -KB958687 08.01.09 Обновление системы безопасности для Windows XP
start /wait .\Update09\WindowsXP-KB958687-x86-RUS.exe /Q /O /N /Z
echo.
echo Done! Please reboot your computer to complete installation!
echo.
pause [/more], подскажите как реализовать это через [Code]
Автор: noiseless
Дата сообщения: 28.01.2009 14:46
de_MAX
А смысл через CODE?
Можно так попробовать:

[RUN]
Filename: "{app}\WindowsXP-KB942288-v3-x86.exe"; Parameters: "/Q /O /N /Z"; FLags: waituntilterminated; StatusMsg: "Установка KB942288..."

По аналогии остальные
Автор: de_MAX
Дата сообщения: 28.01.2009 15:18
noiseless
Ну да так легче, но, а как тогда сделать чтоб прогессбар изменялся по-ходу установки? Т.к. из секции RUN запуск приложений идёт уже после установки...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: в очередной раз босудим антивиры?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.