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

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

Автор: Raf_SE
Дата сообщения: 08.08.2008 23:10
Ну это... Мне тут может ктонить помочь...

Цитата:
Ктонить знает как в реестре записать строку формата "multisz" с таким содержанием:
"{app}\Maps\(2)Challenger.scm
{app}\Maps\Ladder\(4)Lost Temple.scm
{app}\Maps\(5)Sherwood Forest.scm
{app}\Maps\(6)New Gettysburg.scm
{app}\Maps\(8)Green Valleys.scm"
т.е. чтобы было не одной сплошной линией, а каждый новый пункт был с новой строчки.

Мож это хотяб через код можно какнить реализовать? (я просто не шарю в паскалях)
Автор: Genri
Дата сообщения: 09.08.2008 00:20
htuos and all -- [more=Процедура]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Code]
function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';

procedure IBackup(aSrc, aDst: string);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
sSrc, sDst, fileMask: string;
IsPack, IsUnPack: boolean;
SubDirsAllow: Boolean;
FileList: array of TStringList;

shell, srcFolder, dstFolder: Variant;
zipstr: string;
i: integer;
begin
sSrc:= ExpandConstant(aSrc);
sDst:= ExpandConstant(aDst);
IsPack:= ExtractFileExt(sDst) = '.zip';
IsUnPack:= (ExtractFileExt(sSrc) = '.zip') and not IsPack;
if IsPack then // DoZip
begin
if not FileExists(sDst) then
begin
if FileOrDirExists(sSrc) then
begin
zipstr:= Chr($50)+Chr($4B)+Chr($05)+Chr($06);
for i:= 0 to 17 do
zipstr:= zipstr + #0;
ForceDirectories(ExtractFileDir(sDst));
SaveStringToFile(sDst, zipstr, False);

shell:= CreateOleObject( 'Shell.Application' );
dstfolder:= shell.NameSpace( sDst );
if DirExists(sSrc) then
begin
srcFolder:= shell.NameSpace( sSrc );
dstfolder.CopyHere( srcFolder.Items, 0);
end else
dstfolder.CopyHere( sSrc, 0);
while FindWindowEx( 0, 0, '#32770', 'Compressing...' ) = 0 do Sleep( 1 );
while FindWindowEx( 0, 0, '#32770', 'Compressing...' ) > 0 do Sleep( 200 );
end else
MsgBox('Invalid file name!', mbError, MB_OK);;
end else
MsgBox('Archive already exists!', mbError, MB_OK);
end else // End DoZip
if IsUnpack then // DoUnZip
begin
if FileExists(sSrc) then
begin
ForceDirectories(sDst);
shell:= CreateOleObject( 'Shell.Application' );
srcFolder:= shell.NameSpace( sSrc );
dstfolder:= shell.NameSpace( sDst );
dstfolder.CopyHere( srcFolder.Items, 0);
end else
MsgBox('Archive not found!', mbError, MB_OK);
end else // End DoUnZip
begin // DoCopy
sDst:= AddBackslash(sDst)
fileMask:= ExtractFileName(sSrc);
if fileMask = '' then fileMask:= '*';
SubDirsAllow:= fileMask = '*';
sSrc := AddBackslash(ExtractFilePath(sSrc));
SetArrayLength(FileList, 2);
FileList[0]:= TStringList.Create();
FileList[1]:= TStringList.Create();

FindResult := FindFirst(sSrc + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
{files} begin
FileList[0].Add(sSrc+FSR.Name);
FileList[1].Add(sDst+FSR.Name);
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(sSrc + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} IBackup(sSrc + AddBackslash(DSR.Name) + fileMask, sDst + DSR.Name);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
for i:= 0 to FileList[0].Count - 1 do
begin
ForceDirectories(ExtractFilePath(FileList[1].Strings[i]));
FileCopy(FileList[0].Strings[i], FileList[1].Strings[i], False);
end;
end; // End DoCopy
end;
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

procedure InitializeWizard();
begin
/////// П Р И М Е Р Ы И С П О Л Ь З О В А Н И Я ////////

// 1. скопировать файл! TEMP в папку C:\Backup\
// если папки нет, она будет создана
// IBackup('C:\TEMP', 'C:\Backup\');

// 2. скопировать все файлы с подкаталогами папки TEMP в C:\Backup\
// если папки нет, она будет создана
// IBackup('C:\TEMP\', 'C:\Backup\');

// 3. скопировать все файлы с подкаталогами папки TEMP в C:\Backup\ (= п.2)
// если папки нет, она будет создана
// IBackup('C:\TEMP\*', 'C:\Backup\');

// 4. скопировать только файлы (без подкаталогов) из папки TEMP в C:\Backup\
// если папки нет, она будет создана
// IBackup('C:\TEMP\*.*', 'C:\Backup\');

// 5. скопировать только файлы *.bmp из папки TEMP в C:\Backup\
// если папки нет, она будет создана
// IBackup('C:\TEMP\*.bmp', 'C:\Backup\');

// 6. скопировать только файл test.bmp из папки TEMP в C:\Backup\
// если папки нет, она будет создана
// IBackup('C:\TEMP\test.bmp', 'C:\Backup\');

// 7. запаковать только файл test.bmp из папки TEMP в C:\Backup\test.zip
// если папки нет, она будет создана; если test.zip уже есть - ошибка
// IBackup('C:\TEMP\test.bmp', 'C:\Backup\test.zip');

// 8. запаковать только файл save.zip из папки TEMP в C:\Backup\test.zip
// если папки нет, она будет создана; если test.zip уже есть - ошибка
// IBackup('C:\TEMP\save.zip', 'C:\Backup\test.zip');

// 9. запаковать все содержимое папки TEMP в C:\Backup\test.zip
// если папки нет, она будет создана; если test.zip уже есть - ошибка
// IBackup('C:\TEMP\', 'C:\Backup\test.zip');

// 10. распаковать C:\Backup\test.zip в папку TEMP
// если папки нет, она будет создана; если test.zip не найден - ошибка
// IBackup('C:\Backup\test.zip', 'C:\TEMP\');

// Примечания:
// а) процедура поддерживает константы. Например:
// IBackup('{app}\IMAGES\*.bmp', '{sd}\Backup\');
// б) в операциях с архивом, подстановочные символы не работают!
//
///////////////////////////////////////////////////////////////
end; [/no]
Автор: htuos
Дата сообщения: 09.08.2008 02:38
Genri
за код спасибо, архивы создаются
правда вот это

Код: while FindWindowEx( 0, 0, '#32770', 'Compressing...' ) = 0 do Sleep( 1 );
while FindWindowEx( 0, 0, '#32770', 'Compressing...' ) > 0 do Sleep( 200 );
Автор: Victor_Dobrov
Дата сообщения: 09.08.2008 06:55
htuos
Цитата:
нужен другой способ ожидания окончания архивации...

Для бэкапа файлов в архив можно проверять его размер (или то, что архив закрыт по завершении операции)
Для папки назначения можно проверять объём и, если он перестал увеличиваться, значит операция завершена.
Автор: Nep
Дата сообщения: 09.08.2008 08:27
ComradG за оскорбления
Автор: Genri
Дата сообщения: 09.08.2008 11:04
htuos, Victor_Dobrov -- это место у меня вызвало больше всего вопросов. Штатных средств получения какого-нибудь хендла процесса архивации я не знаю. Были попытки использовать Items.Count, но тогда проблемы в случае добавления файлов в существующий архив с частичной перезаписью. Окно вроде создается всегда (пробовал на файле в 9 байт). Возможность добавления в существующий архив временно закрыта.
По поводу размера: размер самого архива неизвестен пока его нет, а когда он создан - уже не нужен. Определение суммарного размера файлов хотя бы раз в секунду, при их большом кол-ве, вызовет дикие тормоза.

Если кто-то из програмеров решал подобную задачу - буду благодарен. Достаточно указания - что проверять. Код сам пропишу.

Добавлено:
И еще: я намеренно усложнил код, чтобы все уместить в одной процедуре. Это сделано для облегчения интеграции тем, кто не очень разбирается в программировании (проще объяснить как перенести одну процедуру с локальными переменными, чем несколько процедур и глобальные). Но если кому надо - отдельно [more=процедуры архивации]

Код:
procedure Zip(aSrc, aDst: string);
var
shell, srcFolder, dstFolder: Variant;
zipstr: string;
i: integer;
begin
if not FileExists(aDst) then
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);
end;
shell:= CreateOleObject( 'Shell.Application' );
dstfolder:= shell.NameSpace( aDst );
if DirExists(aSrc) then
begin
srcFolder:= shell.NameSpace( aSrc );
dstfolder.CopyHere( srcFolder.Items, 0);
end else
dstfolder.CopyHere( aSrc, 0);
end;

procedure UnZip(aSrc, aDst: string);
var
shell, srcFolder, dstFolder: Variant;
begin
shell:= CreateOleObject( 'Shell.Application' );
srcFolder:= shell.NameSpace( aSrc );
dstfolder:= shell.NameSpace( aDst );
dstfolder.CopyHere( srcFolder.Items, 0);
end;
Автор: Raf_SE
Дата сообщения: 09.08.2008 18:53
Как сделать чтоб при запуске, инсталлятор проверял ключь реестра:
Root: HKLM; Subkey: "SOFTWARE\Blizzard Entertainment\Starcraft"; ValueName: "InstallPath"; ValueType: String;
И если он его не нашёл, то писал чето типа: "Starcraft не найден, без его наличия вы не сможете установить мод Realistic. Пожалуйста, установите Starcraft и запустите данный инсталлятор заново."
При этом, ниже инсталлятора нужно чтоб было 2 кнопки "Продолжить" и "Отменить". Ну естественно, нажав на "Продолжить" инсталляция должна продолжиться, нажав на "Отменить" инсталлятор должен закрыться.
Если ключ "InstallPath" реестре найден, тогда инсталлятор никаких сообщений не должен выводить.
Автор: 2Dem
Дата сообщения: 09.08.2008 22:27
Люди, помогите пожалуйста!
Есть код:

Код:
S := ExpandConstant('{app}')
StringChangeEx(S, ':\', '', true);
SaveStringToFile(ExpandConstant('{app}')+'\game.ini', 'CifTreePath=\\' + S + #13, true);
Автор: Victor_Dobrov
Дата сообщения: 10.08.2008 03:54
Raf_SE - вот [more=пример скрипта]
[Setup]
AppName=My program
AppVerName=My program
DefaultDirName={pf}\My program

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
NotFound=Starcraft не найден, без его наличия мод Realistic работать не будет.%nПожалуйста, сначала установите Starcraft, затем инсталлятор мода.
Continue=Про&должить

[Code]
var MessageForm: TPanel; MessageLabel: TLabel;

function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

Function CreateLabel(Parent: TWinControl; AutoSize, WordWrap, Transparent: Boolean; FontName: String; FontStyle: TFontStyles; FontColor: TColor; Left, Top, Width, Height: Integer): TLabel; var tmpLabel: TLabel; Begin
tmpLabel:= TLabel.Create(Parent)
    if Top > 0 then tmpLabel.Top:= Top; if Left > 0 then tmpLabel.Left:= Left; if Width > 0 then tmpLabel.Width:= Width; if Height > 0 then tmpLabel.Height:= Height
    tmpLabel.AutoSize:= AutoSize; tmpLabel.WordWrap:= WordWrap; tmpLabel.Transparent:= Transparent; tmpLabel.ShowHint:= True
    if FontName <> '' then tmpLabel.Font.Name:= FontName; if FontColor > 0 then tmpLabel.Font.Color:= FontColor; if FontStyle <> [] then tmpLabel.Font.Style:= FontStyle
tmpLabel.Parent:= Parent; Result:= tmpLabel
End;

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
     Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of    { нажатие объекта}
    MessageLabel:    MessageForm.Hide;
end;
End;

Procedure Message(String: String; AIndex, IconSize: Integer);    Begin    { размеры формы подстраиваются под текст сообщения}
    MessageLabel.Left:= IconSize + 10 + IconSize/3; MessageLabel.Top:= 10; MessageLabel.Font.Size:= WizardForm.Font.Size + 1
        MessageLabel.Caption:= String; { авторазмер} if MessageLabel.Height < IconSize then MessageLabel.Height:= IconSize
    MessageForm.SetBounds((WizardForm.ClientWidth - (MessageLabel.Width + MessageLabel.Left + 12))/2, (WizardForm.ClientHeight - (MessageLabel.Height + MessageLabel.Top + 8))/2, MessageLabel.Width + MessageLabel.Left + 12, MessageLabel.Height + MessageLabel.Top + 8)
        DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 10, 10, IconSize, MessageForm.Color);
    MessageForm.Show;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
MessageForm.Hide;
Case CurPageID of
    wpWelcome: if not RegValueExists(HKLM, 'Software\Blizzard Entertainment\Starcraft', 'InstallPath') then begin
        Message(ExpandConstant('{cm:NotFound}'), 221, 32)
        WizardForm.NextButton.Caption:= ExpandConstant('{cm:Continue}')
    end;
end;
End;

Procedure InitializeWizard;
Begin
MessageForm:= TPanel.Create(WizardForm)
    MessageForm.Parent:= WizardForm;
    MessageForm.Color:= $E1FFFF; MessageForm.BevelInner:= bvLowered;
MessageLabel:= CreateLabel(MessageForm, true, false, true, 'Arial', [], $402010, 0, 0, 0, 0)
MessageLabel.OnClick:= @ObjectOnClick
End;
[/more], который при отсутствии ключа выводит сообщение, похожее на подсказку Windows.

2Dem - попробуй так: StringChange(S, ExtractFileDrive(S), '')

P.S. если файл game.ini правильный, т.е содержит секции, то можно вместо SaveStringToFile использовать SetIniString.
Автор: 2Dem
Дата сообщения: 10.08.2008 13:51
Victor_Dobrov, спасибо большое!
И еще один вопросик. Как, в том же коде, получить только букву диска, на который происходит установка, без полного пути к папке?
Автор: Victor_Dobrov
Дата сообщения: 10.08.2008 14:49
2Dem, зачем спрашивать то, что есть в любой справке по Паскалю? если S:= ExpandConstant('{app}'), то буква диска будет S[1]
Автор: Diawer
Дата сообщения: 10.08.2008 18:35
Прошу помоч знающих людей в [more=коде][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Tasks]
Name: askini; Description: Указать расположение файла регистрации; GroupDescription: Регистрация программы:

[_Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Регистрация игры', 'Указать расположение файла регистрации игры?',
'Выберите расположение файла регистрации игры, после этого' #13 'нажмите «Далее»:');
Page.Add('Выбор файла регистрации...', 'Legend.exe|Legend.exe', 'Legend.exe');
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) and IsTaskSelected('askini') then
begin
ForceDirectories(ExpandConstant('{app}\'));
FileCopy(Page.Values[0], ExpandConstant('{app}\')+ ExtractFileName(Page.Values[0]), False);
end;
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if (CurPage = Page.ID) and not FileExists(Page.Values[0]) then
Result:= False;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;[/more] сделать отдельную страницу для
[Tasks]
Name: askini; Description: Указать расположение файла регистрации; GroupDescription: Регистрация программы:
после страницы “Выбор дополнительных задач”, надо это для двух целей: для этого именно кода, и для примера как это делать, что бы больше не парить по этому вопросу. Спасибо.
Автор: nOobCrafter
Дата сообщения: 11.08.2008 11:31
2 htuos Спасибо локализовал проблемку) [more=Вот код][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Uninstallable=no

[Code_]
type
TSHFileOpStruct=record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
F:TShFileOpStruct;
a1,a2:string;
begin
F.Wnd:=0;
if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
a1:=FromFile+#0#0;
F.pFrom:=PChar(a1);
a2:=AddBackslash(ToDir)+#0#0;
F.pTo:=PChar(a2);
F.fFlags:=$0254;
Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask:string;IsRemove,IncludeSubDirs:boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;

procedure InitializeWizard();
begin
BackupDir('d:\222\ISGSG_NEW','d:\Backup\'+GetDateTimeString('yyyy/mm/dd hh:nn:ss','_','.'),'*.*',False,True);
end;[/more] который ты мне дал. Все работает ок, но при добавлении срабатывания по задаче (таску) [more=как тут]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Uninstallable=no

[Files]
Source: "compiler:Examples\MyProg.exe"; DestDir: {app};
Source: C:\Converter\*; DestDir: {app}\Converter; BeforeInstall: CreateBackup

[Tasks]
Name: arc; Description: "Создать резервную копию"

[Code]
type
TSHFileOpStruct=record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;


function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer;
external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
F:TShFileOpStruct;
a1,a2:string;
begin
F.Wnd:=0;
if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
a1:=FromFile+#0#0;
F.pFrom:=PChar(a1);
a2:=AddBackslash(ToDir)+#0#0;
F.pTo:=PChar(a2);
F.fFlags:=$0254;
Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask:string;IsRemove,IncludeSubDirs:boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;

procedure CreateBackup();
begin
if IsTaskSelected('arc') then
begin
BackupDir('C:\Rovalant','C:\BackUp\'+ GetDateTimeString('yyyy/mm/dd hh:nn:ss','_','.'),'*.*',False,True);
end;
end;[/more] получается как раньше, каждую секунду добавляется по папке со временем бэкапа. Прошу заметить что вариант "yyyy/mm/dd hh:nn" тоже неподходит, ибо бэкап может выполняться и час, все зависит от машины и размера файлов конфигурации, так что надо как то подругому решить проблему( Что еще можно делать?

2 Diawer Какая тебе именно страница надо?.. Что бы была страница с галочкой "выбора расположения файла регистрации" отдельно от всех тасков? Или что еще?.. А то сама страница выбора файла у тебя же есть..
Автор: SNVSoft
Дата сообщения: 11.08.2008 13:23
Привет,


Цитата:

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked


Как сделать чтобы на странице wpSelectTasks,
первый чекбокс был зачекан ?

Такое
WizardForm.TasksList.ItemChecked[1]:= True;
не проходит ((( (не знает ItemChecked)
Помогит,е плиз!

Автор: htuos
Дата сообщения: 11.08.2008 13:32
nOobCrafter
похоже ты не очень понимаешь что делаешь
попробуй [more=так][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Uninstallable=no

[Files]
Source: "compiler:Examples\MyProg.exe"; DestDir: {app};

Source: C:\Converter\*; DestDir: {app}\Converter
; BeforeInstall: CreateBackup - это не нужно, так ф-ция срабатывает для каждого
; файла из указанной директории (C:\Converter\),
; соответственно каждый раз вычисляется имя директории,
; т.е. как только поменялось время (секунды) будет создан новый каталог

[Tasks]
Name: arc; Description: "Создать резервную копию"

[Code_]
type
TSHFileOpStruct=record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer;
external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
F:TShFileOpStruct;
a1,a2:string;
begin
F.Wnd:=0;
if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
a1:=FromFile+#0#0;
F.pFrom:=PChar(a1);
a2:=AddBackslash(ToDir)+#0#0;
F.pTo:=PChar(a2);
F.fFlags:=$0254;
Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask:string;IsRemove,IncludeSubDirs:boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then
if IsTaskSelected('arc') then
BackupDir('C:\Rovalant','C:\BackUp\'+ GetDateTimeString('yyyy/mm/dd hh:nn:ss','_','.'),'*.*',False,True);
end;[/more]

если я правильно понял, что ты хочешь
Автор: Sampron
Дата сообщения: 11.08.2008 13:32
SNVSoft
Вполне достаточно удалить флаг с первого чекбокса.
Автор: SNVSoft
Дата сообщения: 11.08.2008 13:39
Sampron

[more]
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[/more]

не помогает!
ЗЫ
причом заметил, что оно как то хранит состояние чекбоксов в реестре.
При повторной установке, чекбоксы инициализируются в те состояние, как они при первой установке были выставлены.

А мне нуна железно, при каждой установке, чтобы первый чекбокс был зачекан, НО и с возможностью этот чек снять.
Автор: Sampron
Дата сообщения: 11.08.2008 13:48
SNVSoft
[more=Помогает]
[Setup]
AppName=My Prog
AppVerName=My Prog
DefaultDirName={pf}\My Prog
UsePreviousTasks=no

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[/more]
Автор: SNVSoft
Дата сообщения: 11.08.2008 14:03
Sampron

блин, спасибо тебе Человек!
проста, сразу много английских букв не осилил в хелпе!

кстати,
КОДОМ тоже можно сделать:

Цитата:

Code
procedure CurPageChanged(CurPageID: Integer);
begin

if (CurPageID = wpSelectTasks) then
WizardForm.TasksList.Checked[1]:= true;

end;



Автор: nOobCrafter
Дата сообщения: 11.08.2008 14:48
2 htuos Спасибо большое, я действительно плохо понимаю что делаю) Учебник помогает но там не все есть %)
Вот есть вопрос, если

Код: [Tasks]
Name: "Создание бэкапа"; Description: "Создание бэкапа"; GroupDescription: "Дополнительные задачи:"
Name: "Создание бэкап\Создание бэкап 1"; Description: "Создание бэкапа 1"; GroupDescription: "Дополнительные задачи:"
Name: "Создание бэкап\Создание бэкап 2"; Description: "Создание бэкапа 2"; GroupDescription: "Дополнительные задачи:"
Автор: Raf_SE
Дата сообщения: 11.08.2008 15:04
Я тут экспериментировал с [more=кодом для перемещения]procedure CurPageChanged(CurPageID: Integer);
begin
with WizardForm do
begin
if CurPageID = wpSelectDir then
SelectDirPage.Notebook.ActivePage:= SelectComponentsPage;
if CurPageID = wpSelectComponents then
SelectComponentsPage.Notebook.ActivePage:= SelectDirPage;
DiskSpaceLabel.Caption:= ComponentsDiskSpaceLabel.Caption;
end;
end; [/more] страницы с выбором папки установки, и страницы выбора компонентов (чтоб выбор папки установки был после выбора компонентов). И вобщем иза того что у меня в коде прописан запрет установки в существующую папку, когда я уже установил игру, запускаю повторно инсталлятор, выбираю нужные компоненты, но нажимая на "Далее" мне инсталлятор светит ошибку "Установка в существующую папку в целях безопасности невозможна". Вобщем сам вопрос: можно ли "переместить" скрипт проверки выбраной папки, на страницу вперёд?


[more=Весь скрипт]//Растянутый WizardSmallImage
var
PageNameLabel, PageDescriptionLabel: TLabel;



//Улучшеный деинсталлятор
function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;



//_-=Код Боковушки с описанием компонентов=-_
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
//ComponentsListHandle Боковой КомпонентБокс
//DescLabelHandle Боковой текст
//DescStrings Строки описания разделяються точкой с запятоый ";".

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
//Контроль описания
disabledesc();
end;

procedure InitializeWizard();
begin
// Изменение размер списка Компонентов
WizardForm.TYPESCOMBO.Visible:= false;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);
//Создаеться вертуальный GroupBox (боковушка), ибо Inno Setup неспособен создать реальный.
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'Описание';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
// Параметры текста
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'Переместите ваш указатель мыши на компоненты, чтобы увидеть их описание.';
Info.WordWrap := true;
//Впишыте описание компонентов
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'Выберите язык внутриигрового текста;'+ //Text
'Английский, оригинальный текст;'+ // Text\English
'Русский текст, основывается на переводе фирмы Фаргус. Выберете тип его установки;'+ // Text\Russian
'Расспаковать ресурсы русификатора в корень игры, в папку "data";'+ // Text\Russian\App
'Встроить руссификатор в Patch_D2.mpq;'+ // Text\Russian\MPQ
'Озвучка внутриигровых монологов;'+ // Voice
'Оригинальная, английская озвучка;'+ // Voice\English
'Выберите локализатора;'+ // Voice\Russian
'Профессиональная озвучка от фирмы "Фаргус";'+ // Voice\Russian\Fargus
'Качественная озвучка от фирмы "8bit";'+ // Voice\Russian\8bit
'Качественная озвучка от фирмы "Русский Проект";'+ // Voice\Russian\RuProgect
'Озвучка внутриигрового видео;'+ // Video
'Оригинальная, английская озвучка;'+ // Video\English
'Выберите локализатора;'+ // Video\Russian
'Любительская, одноголосая озвучка;'+ // Video\Russian\Fargus
'Профессиональная, дублированная озвучка;'+ // Video\Russian\8bit
'Качественная, многоголосая закадровая озвучка;'+ // Video\Russian\RuProgect
'Начальные ролики с логотипами Blizzard Entertainment и Blizzard North;'+ //Video\Intro
'Выберите версию игры;'+ // Version
'Оригинальная версия игры;'+ // Version\107
'Дата выпуска: 28.06.2001;'+ // Version\108
'Дата выпуска: 05.12.2001;'+ // Version\109d
'Дата выпуска: 28.10.2003;'+ // Version\110
'Дата выпуска: 13.09.2005;'+ // Version\111b
'Дата выпуска: 17.06.2008;'+ // Version\112a
'Установить Crack для возможности играть без диска. Учтите, после его установки вы не сможете установить новую версию официального патча;'+ // NoCd
'Внутриигровая музика;' // Sound
);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end;

PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
Font.Style := [fsBold];
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(475);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin

with WizardForm do
begin
if CurPageID = wpSelectDir then
SelectDirPage.Notebook.ActivePage:= SelectComponentsPage;
if CurPageID = wpSelectComponents then
SelectComponentsPage.Notebook.ActivePage:= SelectDirPage;
DiskSpaceLabel.Caption:= ComponentsDiskSpaceLabel.Caption;
end;


if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;

PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
end;



//Проверка на оставшыеся файлы
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
If DirExists(ExpandConstant('{app}')+'')
then
case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL)
of IDYES:
begin
if not DelTree(ExpandConstant('{app}')+'', True, True, True)
then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
end
IDNO:
begin
if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res)
then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
end
IDCANCEL:
begin
end;
end;
end;
end;
end;

function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:=True;
If CurPage=wpSelectDir
then
begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2)
then
begin
s:='Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;[/more]
Автор: Diawer
Дата сообщения: 11.08.2008 17:04
nOobCrafter

Цитата:
Какая тебе именно страница надо?.. Что бы была страница с галочкой "выбора расположения файла регистрации" отдельно от всех тасков? Или что еще?.. А то сама страница выбора файла у тебя же есть..

Именно, что бы была страница с галочкой "выбора расположения файла регистрации" отдельно от всех тасков и после страницы выбора ярлыков.
Автор: KurtWagner
Дата сообщения: 12.08.2008 00:11
НУ КТО НИБУДЬ!!! Помогите плиз!!! У меня 4-ри вопроса как при деинстализации высвечивать список удаляемых файлов 1? = http://kurtwagner.wen.ru/Kak.jpg 2?= как поменять цвет сдесь http://kurtwagner.wen.ru/Kak2.JPG и последний вопрос 3?= http://kurtwagner.wen.ru/Kak3.JPG как заставить не высвечивать ощибку сходства а просто пропустить!!! ... + еще 1-ин как сделать чтоб было как и в Inno Setup Quickstartpack 5.2.2 пример...
вообщем как сделать такую загрузку с иНЕТа... заранее спасибо!!! http://kurtwagner.wen.ru/Kak4.jpg
ЗАРАНЕЕ СПАСИБО
Автор: Victor_Dobrov
Дата сообщения: 12.08.2008 01:47
KurtWagner
1) никак, это другой инсталлятор
2) PagefromID(wpWelcome).surface.color:= clBlue;
3) Source: file.dll; DestDir: {sys}; Flags: restartreplace
4) вот пример
Автор: nOobCrafter
Дата сообщения: 12.08.2008 10:15
Diawer Этот вопрос елси я неошибаюсь уже расматривался раньше и в руководстве я чт то похожее видел, тема была как создать вторую страницу с задачами, что бы небыло прорутки. Порыскаю немного сам, а если что то поиск в помощ
гхым...Вот прямо твой вопрос: Как сделать, чтобы дополнительно создать новую страницу и туда перенести задачи раздела [Tasks], чтобы при их выборе происходило копирование в ini-файл, в зависимости от того, что выбрано (из чекбоксов)?

[more=Код]В секции [INI] вместо параметра Tasks: используй параметр Check:.
Т.е. выглядеть это будет примерно так:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "MyProg.ini"; DestDir: "{app}"

[INI]
Filename: {app}\opera6.ini; Section: User Prefs; Key: Save With Images Use Subfolder; String: 1; Check: CheckOption(4); Flags: uninsdeleteentry
Filename: {app}\opera6.ini; Section: User Prefs; Key: Force Encoding; String: AUTODETECT-RU; Check: CheckOption(5); Flags: uninsdeleteentry
Filename: {app}\opera6.ini; Section: User Prefs; Key: Title; Check: CheckOption(0); String: ; Flags: uninsdeleteentry
Filename: {app}\opera6.ini; Section: User Prefs; Key: Use Integrated Search; String: 1; Check: CheckOption(2); Flags: uninsdeleteentry
Filename: {app}\opera6.ini; Section: User Prefs; Key: Ellipsis In Center; String: 1; Check: CheckOption(3); Flags: uninsdeleteentry

[Code]
var
Page: TInputOptionWizardPage;
IsRegisteredUser: Boolean;
procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'License Information', 'Are you a registered user?',
'If you are a registered user, please check the box below, then click Next.',
False, False);

{0} Page.Add('Исправить ошибку page2chm v.2.7 RC1 с Opera v.9.10 и выше');
{1} Page.Add('Исправить кодировку русских символов в оболочке Windows');
{2} Page.Add('Использовать доступное поле множественного поиска');
{3} Page.Add('Сокращать длинные названия кнопок и панелей в середине имени');
{4} Page.Add('Включить сохранение страниц');
{5} Page.Add('Включить рекомендуемую кодировку текста');

Page.Values[0] := True;
end;

function CheckOption(OptionNum: integer): Boolean;
begin
Result:= Page.Values[OptionNum];
end; [/more]
Автор: htuos
Дата сообщения: 12.08.2008 12:04
nOobCrafter

Цитата:
Код:
[Tasks]
Name: "Создание бэкапа"; Description: "Создание бэкапа"; GroupDescription: "Дополнительные задачи:"
Name: "Создание бэкап\Создание бэкап 1"; Description: "Создание бэкапа 1"; GroupDescription: "Дополнительные задачи:"
Name: "Создание бэкап\Создание бэкап 2"; Description: "Создание бэкапа 2"; GroupDescription: "Дополнительные задачи:"

такой вариант, у задачи "Создание бэкапа" есть промежуточное значение (типа выбраны не все компоненты) к которому можно привязать событие или нету ( задача может быть только выбрана полностью, или невыбрана вообще)?
Смысл в том, что если выбраны все компоненты то происходил бы бэкап всей папки вообще, а если выбраны какие то отдальные компоненты то происходил бы их бэкап. Или такое невозможно в данном случае?


думаю стоит все-таки в хэлп заглядывать

Цитата:
TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed);

TCheckBox = class(TCustomCheckBox)
property Alignment: TAlignment; read write;
property AllowGrayed: Boolean; read write;
property Caption: String; read write;
property Checked: Boolean; read write;
property Color: TColor; read write;
property Font: TFont; read write;
property State: TCheckBoxState; read write;
property OnClick: TNotifyEvent; read write;
end;

т.е. можно проверять состояние
на примере из твоего же скрипта

Код: if CurStep=ssInstall then begin
//if IsTaskSelected('arc') then
if WizardForm.TasksList.State[1]=cbChecked{cbUnchecked}{cbGrayed} then
BackupDir('C:\Rovalant\','C:\BackUp\'+ GetDateTimeString('yyyy/mm/dd hh:nn:ss','_','.'),'*.*',False,True);
. . .
end;
Автор: nOobCrafter
Дата сообщения: 12.08.2008 13:00
Спс, думаю весьма актуальная функция)
Автор: Shift7
Дата сообщения: 12.08.2008 15:09
у меня есть такой батник...
set xdir=%windir%\system32
%xdir%\regsvr32.exe /s %xdir%\test\new.dll

пишу в инно так
Exec(ExpandConstant('{sys}')+'\regsvr32.exe', '/s {sys}\test\new.dll ', sLocation, SW_SHOW, ewWaitUntilTerminated, iErrorCode);

но батник работает, а если кодом в инно - то нет.....подскажить че сдесь не правильно?
Автор: Diawer
Дата сообщения: 12.08.2008 16:03
nOobCrafter я, нифига не понял, при чём здесь копирование .ini, не надо ни чего копировать, надо в [more=коде] [Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[CustomMessages]
russian.NecessaryPrograms=Программны необходимые для корректной работы игры:

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
Name: physx; Description: Установить AGEIA PhysX (обязательно); GroupDescription: {cm:NecessaryPrograms}
Name: adberdr; Description: Установить Adobe Reader; GroupDescription: {cm:NecessaryPrograms}; Flags: unchecked
Name: askini; Description: Указать расположение файла регистрации; GroupDescription: Регистрация программы:

[_Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Регистрация игры', 'Указать расположение файла регистрации игры?',
'Выберите расположение файла регистрации игры, после этого' #13 'нажмите «Далее»:');
Page.Add('Выбор файла регистрации...', 'Legend.exe|Legend.exe', 'Legend.exe');
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) and IsTaskSelected('askini') then
begin
ForceDirectories(ExpandConstant('{app}\'));
FileCopy(Page.Values[0], ExpandConstant('{app}\')+ ExtractFileName(Page.Values[0]), False);
end;
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if (CurPage = Page.ID) and not FileExists(Page.Values[0]) then
Result:= False;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;

[Run]
FileName: {drive:{src}}\AdbeRdr\AdbeRdr81.exe; WorkingDir: {drive:{src}}\AdbeRdr; Tasks: adberdr; Flags: skipifsilent waituntilidle
FileName: {drive:{src}}\PhysX\PhysX709.exe; WorkingDir: {drive:{src}}\PhysX; Tasks: physx; Flags: skipifsilent waituntilidle[/more]сделать отдельную страницу для

[Tasks]
Name: askini; Description: Указать расположение файла регистрации; GroupDescription: Регистрация программы:
(после стандартной страницы выбора создания значков), пробовал то что ты дал ни чё не получилось, и в каком руководстве смотреть.





Добавлено:
Я посмотрел, там вторая страница уже есть, где идёт выбор файла, то есть надо ещё страничку между ними.
Автор: SotM
Дата сообщения: 12.08.2008 16:46
Shift7

Цитата:
пишу в инно так
Exec(ExpandConstant('{sys}')+'\regsvr32.exe', '/s {sys}\test\new.dll ', sLocation, SW_SHOW, ewWaitUntilTerminated, iErrorCode);


Попробуй вот так:
Exec(ExpandConstant('{sys}')+'\regsvr32.exe', '/s ' + ExpandConstant('{sys}') + '\test\new.dll', sLocation, SW_SHOW, ewWaitUntilTerminated, iErrorCode);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


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