Прошу помощи, уже в третий раз постараюсь конструктивно поставить вопрос. Тема "тихого" инсталла давно обсуждалась на форуме, но не слишком детально. При создании "тихого" инсталла я столкнулся, по крайней мере, с двумя проблемами:
-----
1) "Проскакивание" (буквально на 1 сек.) страницы с формой прогресс-бара. Отчасти этот вопрос я решил внедрением в скрипт процедуры полной прозрачности окон инсталлятора. Однако, может быть, есть более благородный вариант решения этой проблемы (скрипт см. ниже)?
-----
2) При выполнении через "тихий" инсталл стороннего приложения, заголовок окна "тихого" инсталла отображается на панели быстрого запуска. Очень бы хотелось его полностью сокрыть!
[more=Вот мой скрипт...][_Setup]
AppName=MyProgram
AppVerName=MryPogram 1.0
AppPublisher=Artem_Butenko.
AppCopyright=Copyright (C) 2007 Artem_Butenko, Inc
VersionInfoVersion=1.0
VersionInfoCompany=Artem_Butenko Inc.
VersionInfoCopyright=Artem_Butenko Inc.
SetupIconFile=Icon.ico
DirExistsWarning=no
AppendDefaultDirName=no
Uninstallable=no
CreateUninstallRegKey=no
UsePreviousAppDir=yes
AllowNoIcons=no
DefaultDirName={tmp}
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
OutputBaseFilename=MryPogram 1.0
Compression=lzma/ultra
SolidCompression=yes
;; Файлы включаемые в компиляцию данного инсталляционного пакета
[_Files]
;; Библиотека и рисунок для организации Splash-скрина
Source: "CallNSIS.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "AdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Splash.wav"; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: "Splash.bmp"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Библиотека и музыкальный файл (м.б. в формате .xm, .mod, .it)
Source: "BassMod.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Sound.xm"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Базовый файл в данном пакете
Source: "MyProgram.exe"; DestDir: "{tmp}"; AfterInstall: SetupFBird; Flags: noencryption nocompression deleteafterinstall
[_Code]
{Константы реализации функции прозрачности окна}
const
TransparentPercent = 0; {Процент прозрачности окна}
{Настройка параиетров функции прозрачности}
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);
{Включение в инсталлятор функций прозрачности окна}
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean;
external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';
{Запуск главного файла из временной папки}
procedure SetupFBird();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{tmp}\MyProgram.exe'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
end;
{Необходимые флаги для воспроизведения}
const
BASS_MUSIC_RAMP = 1; {Только для Fast Tracker .xm}
BASS_MUSIC_RAMPS = 2; {Только для Fast Tracker .xm}
BASS_MUSIC_LOOP = 100; {Повторение}
BASS_MUSIC_FT2MOD = 16; {Играть .MOD как FastTracker 2}
BASS_MUSIC_PT1MOD = 32; {Играть .MOD как ProTracker 1}
BASS_MUSIC_SURROUND = 512; {Звучание surround}
BASS_MUSIC_SURROUND2 = 1024; {Звучание surround (режим 2)}
{Определяем процедуры и функции}
{Инициализация библиотеки BassMod.dll}
function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';
{Остановка проигрывания трекерной музыки}
function BASSMOD_MusicStop(): Boolean;
external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';
{Загрузка файла для воспроизведения}
function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';
{Проигрывание трекерной музыки через библиотеку BassMod.dll}
function BASSMOD_MusicPlay(): Boolean;
external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';
{Выгрузка библиотеки BassMod.dll}
procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';
{Процедуры и функции организации Splash-заставки}
procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
external 'callplug@files:callnsis.dll stdcall';
procedure InitializeWizard;
var
Name1: string;
{Настройка параметров Splash-заставки}
begin
ExtractTemporaryFile('Splash.bmp');
ExtractTemporaryFile('Splash.wav')
ExtractTemporaryFile('AdvSplash.dll')
{1000 - 1 секунда; 3000 - время показа рисунка без эффектов появления и затухания; 2000 - время показа плавного появления рисунка;
1500 - время показа плавного затухания рисунка. При нажатии мышой на рисунок заставка закрывается}
callplug(0,ExpandConstant('{tmp}\AdvSplash.dll'),'show','1000','2000','1500','-1',ExpandConstant('{tmp}\Splash'),'','','','','')
{Настройка параметров проигрывания трекерной музыки}
begin
ExtractTemporaryFile('BassMod.dll');
ExtractTemporaryFile('Sound.xm');
{Здесь инициализируем библиотеку в обычной системе со стандартной аудиокартой}
if not BASSMOD_Init(-1,44100,0)
then
begin
{Выгружаем dll при неудачной инициализации}
MsgBox('BASSMOD не смогла инициализироваться, проигрывание музыки невозможно.', mbError, MB_OK)
BASSMOD_Free;
end else;
Name1:=ExpandConstant('{tmp}\Sound.xm');
{Загружаем и воспроизводим}
if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, 4 or 512 or 32 or 1) then
BASSMOD_MusicPlay;
{Инициализация функции прозрачности окна в ходе установки}
begin
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE,
GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(WizardForm.Handle, 0,
(255 * TransparentPercent) / 100, LWA_ALPHA);
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
begin
If CurPageID=wpFinished then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;
end;
end;
procedure DeInitializeSetup();
begin
BASSMOD_MusicStop; {Остановка проигрывания}
BASSMOD_Free(); {Выгрузка библиотеки из памяти}
end;[/more]
Добавлено:
Еще хотелось бы немного затронуть тему бэкапа данных в Inno Setup на основе использования SHFileOperation.iss. В инсталлах некоторых русификаторов замечал, что чек-бокс создания бэкапа вынесен на страницу выбора директории установки и при его выборе размер отображаемого внизу страницы дискового пространства для установки русификатора изменяется (увеличивается). Как реализовать подобный эффект?
Genri
Ранее Вы говорили о возможности распаквки .*zip архивов через Inno Setup. У меня возникла такая идея (поясняю подробно): создать единый инсталлятор для упаковки приложения в его Lite и Full-версиях. При этом в сам исполнительный файл инсталлятора будет упакована Lite-версия приложения, а Full-версия будет находиться рядом в zip-архиве.
В чем собственно проблема? Я не знаю, как организовать такое действие: на странице выбора директории установки расположить чек-бокс (Установить Full-версию), который будет не активен, в случае отсутствия рядом с исполнительным файлом инсталлятора заветного zip-архива (с полной версией программы), в данном случае будет установлена только Lite-версия. Если же zip-архив с определенным именем присутствует рядом, то чек-бокс будет активен (т.е. будет возможность отметить или нет установку полной версии приложения). Неплохо было бы осуществлять через инсталлятор проверку не только имени этого zip-архива, но и его MD5-хеш.
Понимаю, вопрос "муторный" и многим может показаться не практичным, но все же, я искренне надеюсь на Вашу добрую помощь!
-----
1) "Проскакивание" (буквально на 1 сек.) страницы с формой прогресс-бара. Отчасти этот вопрос я решил внедрением в скрипт процедуры полной прозрачности окон инсталлятора. Однако, может быть, есть более благородный вариант решения этой проблемы (скрипт см. ниже)?
-----
2) При выполнении через "тихий" инсталл стороннего приложения, заголовок окна "тихого" инсталла отображается на панели быстрого запуска. Очень бы хотелось его полностью сокрыть!
[more=Вот мой скрипт...][_Setup]
AppName=MyProgram
AppVerName=MryPogram 1.0
AppPublisher=Artem_Butenko.
AppCopyright=Copyright (C) 2007 Artem_Butenko, Inc
VersionInfoVersion=1.0
VersionInfoCompany=Artem_Butenko Inc.
VersionInfoCopyright=Artem_Butenko Inc.
SetupIconFile=Icon.ico
DirExistsWarning=no
AppendDefaultDirName=no
Uninstallable=no
CreateUninstallRegKey=no
UsePreviousAppDir=yes
AllowNoIcons=no
DefaultDirName={tmp}
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
OutputBaseFilename=MryPogram 1.0
Compression=lzma/ultra
SolidCompression=yes
;; Файлы включаемые в компиляцию данного инсталляционного пакета
[_Files]
;; Библиотека и рисунок для организации Splash-скрина
Source: "CallNSIS.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "AdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Splash.wav"; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: "Splash.bmp"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Библиотека и музыкальный файл (м.б. в формате .xm, .mod, .it)
Source: "BassMod.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Sound.xm"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Базовый файл в данном пакете
Source: "MyProgram.exe"; DestDir: "{tmp}"; AfterInstall: SetupFBird; Flags: noencryption nocompression deleteafterinstall
[_Code]
{Константы реализации функции прозрачности окна}
const
TransparentPercent = 0; {Процент прозрачности окна}
{Настройка параиетров функции прозрачности}
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);
{Включение в инсталлятор функций прозрачности окна}
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean;
external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';
{Запуск главного файла из временной папки}
procedure SetupFBird();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{tmp}\MyProgram.exe'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
end;
{Необходимые флаги для воспроизведения}
const
BASS_MUSIC_RAMP = 1; {Только для Fast Tracker .xm}
BASS_MUSIC_RAMPS = 2; {Только для Fast Tracker .xm}
BASS_MUSIC_LOOP = 100; {Повторение}
BASS_MUSIC_FT2MOD = 16; {Играть .MOD как FastTracker 2}
BASS_MUSIC_PT1MOD = 32; {Играть .MOD как ProTracker 1}
BASS_MUSIC_SURROUND = 512; {Звучание surround}
BASS_MUSIC_SURROUND2 = 1024; {Звучание surround (режим 2)}
{Определяем процедуры и функции}
{Инициализация библиотеки BassMod.dll}
function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';
{Остановка проигрывания трекерной музыки}
function BASSMOD_MusicStop(): Boolean;
external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';
{Загрузка файла для воспроизведения}
function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';
{Проигрывание трекерной музыки через библиотеку BassMod.dll}
function BASSMOD_MusicPlay(): Boolean;
external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';
{Выгрузка библиотеки BassMod.dll}
procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';
{Процедуры и функции организации Splash-заставки}
procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
external 'callplug@files:callnsis.dll stdcall';
procedure InitializeWizard;
var
Name1: string;
{Настройка параметров Splash-заставки}
begin
ExtractTemporaryFile('Splash.bmp');
ExtractTemporaryFile('Splash.wav')
ExtractTemporaryFile('AdvSplash.dll')
{1000 - 1 секунда; 3000 - время показа рисунка без эффектов появления и затухания; 2000 - время показа плавного появления рисунка;
1500 - время показа плавного затухания рисунка. При нажатии мышой на рисунок заставка закрывается}
callplug(0,ExpandConstant('{tmp}\AdvSplash.dll'),'show','1000','2000','1500','-1',ExpandConstant('{tmp}\Splash'),'','','','','')
{Настройка параметров проигрывания трекерной музыки}
begin
ExtractTemporaryFile('BassMod.dll');
ExtractTemporaryFile('Sound.xm');
{Здесь инициализируем библиотеку в обычной системе со стандартной аудиокартой}
if not BASSMOD_Init(-1,44100,0)
then
begin
{Выгружаем dll при неудачной инициализации}
MsgBox('BASSMOD не смогла инициализироваться, проигрывание музыки невозможно.', mbError, MB_OK)
BASSMOD_Free;
end else;
Name1:=ExpandConstant('{tmp}\Sound.xm');
{Загружаем и воспроизводим}
if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, 4 or 512 or 32 or 1) then
BASSMOD_MusicPlay;
{Инициализация функции прозрачности окна в ходе установки}
begin
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE,
GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(WizardForm.Handle, 0,
(255 * TransparentPercent) / 100, LWA_ALPHA);
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
begin
If CurPageID=wpFinished then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;
end;
end;
procedure DeInitializeSetup();
begin
BASSMOD_MusicStop; {Остановка проигрывания}
BASSMOD_Free(); {Выгрузка библиотеки из памяти}
end;[/more]
Добавлено:
Еще хотелось бы немного затронуть тему бэкапа данных в Inno Setup на основе использования SHFileOperation.iss. В инсталлах некоторых русификаторов замечал, что чек-бокс создания бэкапа вынесен на страницу выбора директории установки и при его выборе размер отображаемого внизу страницы дискового пространства для установки русификатора изменяется (увеличивается). Как реализовать подобный эффект?
Genri
Ранее Вы говорили о возможности распаквки .*zip архивов через Inno Setup. У меня возникла такая идея (поясняю подробно): создать единый инсталлятор для упаковки приложения в его Lite и Full-версиях. При этом в сам исполнительный файл инсталлятора будет упакована Lite-версия приложения, а Full-версия будет находиться рядом в zip-архиве.
В чем собственно проблема? Я не знаю, как организовать такое действие: на странице выбора директории установки расположить чек-бокс (Установить Full-версию), который будет не активен, в случае отсутствия рядом с исполнительным файлом инсталлятора заветного zip-архива (с полной версией программы), в данном случае будет установлена только Lite-версия. Если же zip-архив с определенным именем присутствует рядом, то чек-бокс будет активен (т.е. будет возможность отметить или нет установку полной версии приложения). Неплохо было бы осуществлять через инсталлятор проверку не только имени этого zip-архива, но и его MD5-хеш.
Понимаю, вопрос "муторный" и многим может показаться не практичным, но все же, я искренне надеюсь на Вашу добрую помощь!