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

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

Автор: Forslay
Дата сообщения: 06.04.2008 16:08
Хех иконка то не нарисовалась... хотя крестик остался....
Автор: machetos
Дата сообщения: 06.04.2008 16:19
serg_aka_lain

Цитата:
Вот способ:
В дистрибутив включ. пустой файл "desktop.ini"
Source: "desktop.ini"; DestDir: "{app}"; Attribs: "hidden system"; Flags: ignoreversion;
Папка в которую устанавливается тоже должна иметь - Attribs: "system";
[Dirs]
Name: "{app}"; Attribs: "system"; Flags: uninsalwaysuninstall;
Ну и в конце установки записываем в "desktop.ini" путь к иконке .exe, или .ico файлу.


способ работает, но из-за присвоения папке арр атрибута sistem, она становится скрытой (( Как с этим борться?
Автор: htuos
Дата сообщения: 06.04.2008 16:42
Forslay
если ты про мой способ, то иконка рисуется, а кнопка "Х" становится недоступной
пришлось проверить даже

ЗЫ не очень понимаю смысл убирания кнопки "Х". Alt+F4 все равно никто не отменял да и по кнопке "отмена" выполняются те же действия

Добавлено:
machetos
1. скрытым должен стать только файл desktop.ini, на каталог не ставь атрибуты. от атрибутов вообще ничего не зависит
2. тебе писали еще один способ, без таскания с собой пустого файла
Автор: Hater_Decay
Дата сообщения: 06.04.2008 21:13
Лан, вы кончено уж простите, но раз никто не знает ответа на мой вопрос (или не хочет отвечать) тогда более ламерский вопрос - можно ли после завершения деинтсалляции заставить выполниться какой-то внешний файл (ехе, тхт, бат и т.п.). Как допустим

[Run]
Filename: {app}\bin\main.exe; Description: {cm:LaunchProgram}; Flags: nowait postinstall skipifsilent

запускает main.exe после завершения инсталляции (если не снять галочку конечно), так и хотелось бы что-нить запустить после ДЕинсталляции
Автор: elapse
Дата сообщения: 06.04.2008 21:58
Hater_Decay, смотри в справке Exec и ShellExec. Описание в Pascal Scripting --> Support Functions Reference --> Files functions.
Прописываешь в

Код:
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usDone then
begin
...
end;
end;
Автор: serg_aka_lain
Дата сообщения: 06.04.2008 22:09
machetos

Не может быть, всё должно работать . вот пример через
секцию Code , без пустого файла Desktop.ini и использования секции Dirs

var
ErrorCode: Integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', '[.ShellClassInfo]' + #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', 'IconFile' + '=' + ExpandConstant('{app}') + '\Icon.ico' + #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', 'IconIndex' + '=' + '0' + #13#10, true);
Exec('attrib', ' +s ' + '"' + ExpandConstant('{app}') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
Exec('attrib', ' +h +s ' + '"' + ExpandConstant('{app}\desktop.ini') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
end;
end;

p.s. (и не забыть всё удалить при деинсталляции.)
Автор: Hater_Decay
Дата сообщения: 06.04.2008 22:27
elapse
Cпасибо, так и сделал, всё заработало. Насчёт читать хелп это конечно универсально полезный совет, только вот понять что где писать в ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean; куда сложнее чем увидеть готовую строку и из неё переделать.
Автор: machetos
Дата сообщения: 06.04.2008 23:16
serg_aka_lain
Цитата:
Не может быть, всё должно работать . вот пример через
секцию Code

вот мой код как есть (точ такой как у тебя)

[Setup]
AppName=myprog
AppVerName=myprog
DefaultDirName=C:\myprog
DefaultGroupName=myprog
Compression=lzma
SolidCompression=yes

[Files]
Source: C:\1\myprog.exe; DestDir: "{app}"; Flags: ignoreversion

[Code]
var
ErrorCode: Integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', '[.ShellClassInfo]' + #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', 'IconFile' + '=' + ExpandConstant('{app}') + '\myprog.exe' + #13#10, true);
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini', 'IconIndex' + '=' + '0' + #13#10, true);
Exec('attrib', ' +s ' + '"' + ExpandConstant('{app}') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
Exec('attrib', ' +h +s ' + '"' + ExpandConstant('{app}\desktop.ini') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
end;
end;

Но папка с программой СКРЫТА
разве в строке Exec('attrib', ' +s ' + '"' + ExpandConstant('{app}') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode) ей не придаётся атрибут системной? Что делать?





Добавлено:
а если убрать атрибуты системной (скрытой), то ini-шник создаётся, скрывается, внутри всё прописано, но папка с прогой всё та же папка, без иконки
Автор: Sampron
Дата сообщения: 06.04.2008 23:21
Hater_Decay

Цитата:
куда сложнее чем увидеть готовую строку и из неё переделать.


Примерно так:
//ShellExec('', путь\имя файла, 'параметр запуска', рабочая папка, SW_SHOW, ewNoWait, ErrorCode)

пример:

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ErrorCode: Integer;
begin
if CurUninstallStep = usDone then
begin
ShellExec('', ExpandConstant('{win}\NOTEPAD.EXE'), '', ExpandConstant('{win}'), SW_SHOW, ewNoWait, ErrorCode)
end
end;
Автор: htuos
Дата сообщения: 06.04.2008 23:35
machetos
вроде достаточно этого
Exec('attrib', ' +r ' + '"' + ExpandConstant('{app}') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
не ставь скрытый и системный
Автор: serg_aka_lain
Дата сообщения: 06.04.2008 23:46
htuos

С атрибутом "только для чтения" - "+r" тоже работает.
Автор: machetos
Дата сообщения: 06.04.2008 23:54

Цитата:
machetos
вроде достаточно этого
Exec('attrib', ' +r ' + '"' + ExpandConstant('{app}') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
не ставь скрытый и системный

Спасибо, работает!!!


Цитата:
тебе писали еще один способ, без таскания с собой пустого файла

без пустого а сразу - это хорошо, но вот только при деинсталяции папка с прогой не удаляется, т.к. там остаётся файл этот, может можно ему задать какой-нибудь атрибут, чтоб он тоже деинсталился?

Автор: serg_aka_lain
Дата сообщения: 07.04.2008 00:08
machetos

удали через Code

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}') + '\desktop.ini');
end;
end;

Автор: machetos
Дата сообщения: 07.04.2008 00:16
serg_aka_lain
и верно.. туплю )))
спасибо
Автор: Forslay
Дата сообщения: 07.04.2008 11:43
Народ, помогите пожалуйста реализовать функцию в инсталляхе: Print Button Click, если я правильно написал....

Мне нужно что бы на странице лицензионного соглашения, была кнопочка: Печать лицензионного соглашения... Заранее очень благодарю....


Через _ISSI неполучается, ошибка при компилляции....
Автор: elapse
Дата сообщения: 07.04.2008 12:35
Forslay, берёшь из шапки Inno Setup Extensions Knowledge Base, находишь там 100-ую статью - с копипастом проблем возникнуть не должно. Лень качать - см. [more=здесь][no]
[Setup]
AppName=PrintLicV5
AppVerName=PrintLicV5
DefaultDirName={pf}\PrintLicV5
DisableStartupPrompt=true
Uninstallable=false
DisableDirPage=true
OutputBaseFilename=PrintLicV5
CreateAppDir=false
DisableProgramGroupPage=true
LicenseFile=MyLicense.rtf


[Files]
Source: MyLicense.rtf; Flags: dontcopy


[Code]

// Print license
procedure PrintButtonClick(Sender: TObject);
var WordpadLoc: String;
    RetCode: Integer;
begin

if MsgBox( 'Do you want to print License to default printer ?', mbConfirmation, MB_YESNO ) = IDYES then
begin

    // get WordPad location
    RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WORDPAD.EXE',
     '', WordpadLoc);

    // on NT/2000 it's a REG_EXPAND_SZ, so expand constant ProgramFiles
    StringChange( WordpadLoc, '%ProgramFiles%', ExpandConstant('{pf}') );
    // remove " at begin and end pf string
    StringChange( WordpadLoc, '"', '');

    // extract License file
    try
     ExtractTemporaryFile('MyLicense.rtf');

     if not Exec( WordPadLoc, ' /p ' + ExpandConstant('{tmp}\MyLicense.rtf') ,
     ExpandConstant('{tmp}'), SW_HIDE, ewNoWait , RetCode ) then
     MsgBox('Problems printing License file !' + IntToStr(RetCode), mbError, mb_Ok) ;
    
except
RaiseException('Problem printing license '+#13#13 +
'(Error ''' + GetExceptionMessage + ''' occurred)');
end;

end; // if user want to print the license

end;


procedure InitializeWizard();
var
PrintButton: TButton;
begin
PrintButton := TButton.Create(WizardForm.LicensePage);
PrintButton.Caption := '&Print';
PrintButton.Left := WizardForm.LicenseMemo.Left +
WizardForm.LicenseMemo.Width -
PrintButton.Width;
PrintButton.Top := WizardForm.LicenseMemo.Top +
WizardForm.LicenseMemo.Height + 16;
PrintButton.OnClick := @PrintButtonClick;
PrintButton.Parent := WizardForm.LicenseAcceptedRadio.Parent;
end;[/no][/more].
Автор: Dimbay
Дата сообщения: 07.04.2008 18:29

Продолжаю изучение...

У меня во время инсталляции запускается батник,в этот момент полоса прогресса останавливается(процесс длится несколько минут).Как именно для этой строки (во время работы батника) сделать свою полосу прогресса?
Source: unpack.bat; DestDir: {app}; AfterInstall: Unpack(); Flags: ignoreversion

Нашёл здесь такой пример создания полосы:

var
ProgressBar: TNewProgressBar;
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
begin
If CurPageID=wpInstalling
then
begin
ProgressBar := TNewProgressBar.Create(WizardForm);
ProgressBar.Left := ScaleY(40);
ProgressBar.Top := ScaleX(180);
ProgressBar.Width := ScaleY(415);
ProgressBar.Height := ScaleX(18);
ProgressBar.Parent := WizardForm;
ProgressBar.Position := 0; //указывает количество заполняемых секторов
end;
begin
If CurPageID=wpFinished
then
ProgressBar.Hide
end;
end;
[[more][/more]
Как их связать,пока не догоню...
Автор: Forslay
Дата сообщения: 07.04.2008 19:48
elapse, большое тебе спасибо братка.... Всё работает ! Респект!
Автор: KurtWagner
Дата сообщения: 08.04.2008 00:26
Народ как сделать так чтоб компьютер перезагружался без потверждения???
Автор: GRom V
Дата сообщения: 08.04.2008 05:43
Помогите кто может.....нужно в реестр внести вот это -
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7B97E000527E10F478A01C92247B8F4E\InstallProperties; ValueType: string; ValueName: InstallSource; ValueData: F:\; Flags: uninsdeletekey

где (ValueName: InstallSource; ValueData: F:\) а именно F:\ - это буква DVD Room.
Но эта буква может быть разной.
Как сделать проверку буквы DVD Room и внести нужную в реестр?
Заранее благодарен

Добавлено:
Вопрос 2.... Создаем ярлык

Как сделать автоматом если система 32 разряда то создается ярлык -
Name: {userdesktop}\{#MyAppName}; Filename: {app}\Bin32\Crysis.exe; Tasks: desktopicon; IconFilename: {app}\Bin32\Crysis.exe; Comment: Запустить Crysis; IconIndex: 0; WorkingDir: {app}\Bin32
Если 64 разряда то -
Name: {userdesktop}\{#MyAppName}; Filename: {app}\Bin64\Crysis64.exe; Tasks: desktopicon; IconFilename: {app}\Bin64\Crysis64.exe; Comment: Запустить Crysis; IconIndex: 0; WorkingDir: {app}\Bin64

???
Автор: htuos
Дата сообщения: 08.04.2008 09:32
GRom V

Цитата:
Как сделать проверку буквы DVD Room и внести нужную в реестр?

а если в системе больше 1 привода, что тогда писать?
Автор: GRom V
Дата сообщения: 08.04.2008 09:40
htuos

Цитата:
а если в системе больше 1 привода, что тогда писать?

Без разници - главное чтобы был существующий!
Автор: Chanka
Дата сообщения: 08.04.2008 10:32
GRom V
1)
[Registry]
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7B97E000527E10F478A01C92247B8F4E\InstallProperties"; ValueName: "InstallSource"; ValueType: String; ValueData: "{src}"; Flags: uninsdeletekey

Неправильно понял задачу
Автор: elapse
Дата сообщения: 08.04.2008 10:39
GRom V, примерно [more=так]
[Код]
const
DRIVE_CDROM = 5;
var
n: Integer;

function GetLogicalDrives: DWord;
external 'GetLogicalDrives@kernel32.dll';

function GetDriveType( nDrive: String ): Longint;
external 'GetDriveTypeA@kernel32.dll';

function GetDriveLetter(Param: String): String;
begin
for n := 1 to 31 do
if (GetLogicalDrives and (1 shl n)) > 0 then
if GetDriveType(Chr(65 + n) + ':\') = DRIVE_CDROM then
begin
Result := Chr(65 + n) + ':\'
Exit;
end;
end;
[/more]. Добавляешь эту часть в свой проект, а в ValueData указываешь {code:GetDriveLetter} вместо F:\. Только непонятно, что делать, если отсутствуют дисководы, отменять инсталляцию, писать новое значение? Если не подходит пустое значение, подправить не сложно - надеюсь, сделаешь сам.

Добавлено:
По второму вопросу - также использовать {code:...}, проверка на битность - функцией IsWin64, описание см. в Хелпе.

Добавлено:
Chanka, скорее всего, ты как раз правильно понял задачу. Очевидно, надо чтобы в реестр заносилась буква диска, с которого происходит инсталляция, если это - дисковод, то разрешаем запись в реестр, если нет (жёсткий, флешка и т.д.) - отменяем инсталляцию... Тогда используем ExtractFileDrive из константы {src}. В любом случае --> {code:...}
Автор: GRom V
Дата сообщения: 08.04.2008 15:07
elapse

Цитата:
GRom V, примерно так. Добавляешь эту часть в свой проект, а в ValueData указываешь {code:GetDriveLetter} вместо F:\. Только непонятно, что делать, если отсутствуют дисководы, отменять инсталляцию, писать новое значение? Если не подходит пустое значение, подправить не сложно - надеюсь, сделаешь сам.


Спасибо - то что нужно! С этим разобрался.

Для второго вопроса нашол:

function InitializeSetup : Boolean;
var error : Integer;

begin
if IsWin64 then
begin
Exec(ExpandConstant('{src}') + '\File_64.exe', '', '', sw_show, ssInstall, error);
Result:= True;
end
else
begin
Exec(ExpandConstant('{src}') + '\File_32.exe', '', '', sw_show, ssInstall, error);
Result:=True;
end
end;

Это запуск экзешника в зависимости от разрядности......только не могу прикрутить этот скрипт к секции [Icons]
Подскажи как это сделать (если можно) т.е
[Icons]
Name: {userdesktop}\{#MyAppName}; Filename: {app}\Bin32\Crysis.exe; Tasks: desktopicon; IconFilename: {app}\Bin32\Crysis.exe; Comment: Запустить Crysis; IconIndex: 0; WorkingDir: {app}\Bin32 - 32разряда

Name: {userdesktop}\{#MyAppName}; Filename: {app}\Bin64\Crysis64.exe; Tasks: desktopicon; IconFilename: {app}\Bin64\Crysis64.exe; Comment: Запустить Crysis; IconIndex: 0; WorkingDir: {app}\Bin64 -64разряда

Спасибо...



Автор: elapse
Дата сообщения: 08.04.2008 17:23
GRom V, неужели так сложно? [more=Подробнее][no]
[Code]
function GetFilename(Param: String): String;
begin
if IsWin64 then
Result := ExpandConstant('{app}\Bin64\Crysis64.exe')
else
Result := ExpandConstant('{app}\Bin32\Crysis.exe');
end;

function GetWorkingDir(Param: String): String;
begin
if IsWin64 then
Result := ExpandConstant('{app}\Bin64')
else
Result := ExpandConstant('{app}\Bin32');
end;

[Icons]
Name: {userdesktop}\{#MyAppName}; Filename: {code:GetFilename}; Tasks: desktopicon; IconFilename: {code:GetFilename}; Comment: Запустить Crysis; IconIndex: 0; WorkingDir: {code:GetWorkingDir};
[/no][/more].
Автор: Diawer
Дата сообщения: 08.04.2008 18:15
Подскажите, как относительно языка менялся Key: Lang; на соответствующую цифру,
в [more=файле]Resolution 1024x768
Depth 32bit
Quality 0
MusicVol 5
SoundVol 5
CameraMode 0
FullScreen 1
Lang 1
[/more]нет Section: ; и при компиляции ругаеться.

[Files]
Source: gameconf.ini; DestDir: {app}; Flags: ignoreversion

[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
Name: ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[INI]
Filename: {app}\BaseT\gameconf.ini; Section: ; Key: Lang; String: 0; Languages: english
Filename: {app}\BaseT\gameconf.ini; Section: ; Key: Lang; String: 1; Languages: russian
Filename: {app}\BaseT\gameconf.ini; Section: ; Key: Lang; String: 2; Languages: ukrainian
Автор: valeron87
Дата сообщения: 08.04.2008 18:31
GRom V
Еще можно без секции Code [more]

Код:
#define MainExe "{app}\Bin32\crysis.exe"
#define MainExe64 "{app}\Bin64\crysis.exe"
#define MainExeDir Copy(MainExe, 1, RPos("\", MainExe)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1)

[Icons]
Name: "{group}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Check: IsWin64
Name: "{group}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Check: not IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe64}"; WorkingDir: "{#MainExe64Dir}"; Tasks: desktopicon; Check: IsWin64
Name: "{userdesktop}\{#AppName}"; FileName: "{#MainExe}"; WorkingDir: "{#MainExeDir}"; Tasks: desktopicon; Check: not IsWin64
Name: "{group}\Удалить игру"; FileName: "{uninstallexe}"; IconFileName: "{sys}\shell32.dll"; IconIndex: 32
Автор: Dimbay
Дата сообщения: 08.04.2008 20:20
Genri
Приветствую!
Не подскажешь по моему вопросу?
Как для определённого файла(на время его работы),сделать свою полосу прогресса?
Автор: GRom V
Дата сообщения: 09.04.2008 03:15
elapse

Цитата:
GRom V, неужели так сложно? Подробнее.

Огромное спасибо...все окк.


Добавлено:
elapse
Прошу просчения....я не такой бетман в паскале как ты....подскажи еще примерчик (если не трудно):
есть

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\{{10656425-AFEB-42F3-9E51-D4A92B7EE022}; ValueType: string; ValueName: ConfigInstallType; ValueData: 2; Flags: uninsdeletekey; Tasks: WGE

Как сделать чтобы - если стоит виста то эта ветка вносилась в реестр, если нет то не вносилась?

Заранее спасибочки...


Добавлено:
valeron87
Интересный вариант...
Глянь личку....
Да....а зачем эти строки...вроде и без них все работает?
#define MainExe32Dir Copy(MainExe32, 1, RPos("\", MainExe32)-1)
#define MainExe64Dir Copy(MainExe64, 1, RPos("\", MainExe64)-1)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


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