Victor_Dobrov
Я все с тем же наболевшим вопросом по поводу создания лоадера программ на Inno Setup. Недавно написал [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.ex_"; DestDir: "{src}"; AfterInstall: SetupFBird; Flags: noencryption nocompression
Source: "MyProgram2.ex_"; DestDir: "{src}"; AfterInstall: SetupFBird; Flags: noencryption nocompression
[_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('{src}\MyProgram.ex_'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
begin
Exec(ExpandConstant('{src}\MyProgram2.ex_'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
end;
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], отчасти помогающий реализовать задуманное.
Но при реализации скрипта на практике возникают проблемы такого содержания:
- внешние исполняемые файлы (MyProgram.ex_ и MyProgram2.ex_) почему-то запаковываются в инсталлятор. Хотя компилируются с константами {src};
- файл MyProgram.ex_ выполняется непонятно почему дважды(!), хотя MyProgram2.ex_ срабатывает один раз (как и необходимо);
- если из скрипта убрать процедуру прозрачности окон, то в конце установки на некоторое время появляется пустая форма окна с прогресс-баром. Хотелось бы "побороть" этот трабл более эстетичным образом, нежели назначения абсолютной прозрачности окнам лоадера.
Пожалуйста, подскажите в правильном ли направлении я развиваю этот скрипт, или, что-то можно сделать иначе, более рационально. Во всяком случае буду рад Вашей помощи!
Добавлено:
Совсем забыл, а можно ли убрать отображение окна лоадера (во время исполнения внешнего файла) на панели быстрого запуска?
Я все с тем же наболевшим вопросом по поводу создания лоадера программ на Inno Setup. Недавно написал [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.ex_"; DestDir: "{src}"; AfterInstall: SetupFBird; Flags: noencryption nocompression
Source: "MyProgram2.ex_"; DestDir: "{src}"; AfterInstall: SetupFBird; Flags: noencryption nocompression
[_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('{src}\MyProgram.ex_'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
begin
Exec(ExpandConstant('{src}\MyProgram2.ex_'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
end;
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], отчасти помогающий реализовать задуманное.
Но при реализации скрипта на практике возникают проблемы такого содержания:
- внешние исполняемые файлы (MyProgram.ex_ и MyProgram2.ex_) почему-то запаковываются в инсталлятор. Хотя компилируются с константами {src};
- файл MyProgram.ex_ выполняется непонятно почему дважды(!), хотя MyProgram2.ex_ срабатывает один раз (как и необходимо);
- если из скрипта убрать процедуру прозрачности окон, то в конце установки на некоторое время появляется пустая форма окна с прогресс-баром. Хотелось бы "побороть" этот трабл более эстетичным образом, нежели назначения абсолютной прозрачности окнам лоадера.
Пожалуйста, подскажите в правильном ли направлении я развиваю этот скрипт, или, что-то можно сделать иначе, более рационально. Во всяком случае буду рад Вашей помощи!
Добавлено:
Совсем забыл, а можно ли убрать отображение окна лоадера (во время исполнения внешнего файла) на панели быстрого запуска?