Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]
Я это исправил, куда же мне архивы указывать?
Молодой, никуда их указывать не нужно, просто ложи их рядом с setup.exe и они распакуются. Кстати, ты используешь не тот код, который просил...
[Молодой, если тебе нужно два прогресс бара нужно использовать код FreeArc Example Ext
Молодой, поправил тебе [CustomMessages]... и добавил недостающее в type (нужен ISPP) [Setup]
AppId={{7E33187A-FE34-4C9F-8E97-3CDA68BB71B4}
AppName=BloodRayne 2
AppVerName=BloodRayne 2
AppPublisher=Repack By BaRS
DefaultDirName={pf}\BloodRayne 2
DefaultGroupName=BloodRayne 2
OutputDir=C:\Users\BaRS\Desktop\Install\Новая папка
OutputBaseFilename=setup
SetupIconFile=D:\Game\BloodRayne 2\publisher.ico
Compression=lzma/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
[Languages]
Name: "Default"; MessagesFile: "compiler:Default.isl"
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[CustomMessages]
Default.ArcBreak=Installation cancelled!
Default.ExtractedInfo=Extracted %1 Mb of %2 Mb
Default.ArcInfo=Archive: %1 of %2
Default.ArcTitle=Extracting FreeArc archive
Default.ArcError=Decompression failed with error code %1
Default.ArcFail=Decompression failed!
Default.AllProgress=Overall extraction progress: %1%%
Default.ArcBroken=Archive %1 is damaged%nor not enough free space.
Default.Extracting=Extracting: %1
Default.taskbar=%1%%, %2 remains
Default.remains=Remaining time: %1
Default.LongTime=at no time
Default.ending=ending
Default.hour= hours
Default.min= mins
Default.sec= secs
Russian.ArcBreak=Установка прервана!
Russian.ExtractedInfo=Распаковано: %1 Мб из %2 Мб
Russian.ArcInfo=Архив: %1 из %2
Russian.ArcTitle=Распаковка ресурсов игры...
Russian.ArcError=Распаковщик FreeArc вернул код ошибки: %1
Russian.ArcFail=Распаковка не завершена!
Russian.AllProgress=Общий прогресс распаковки: %1%%
Russian.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
Russian.Extracting=%1
Russian.taskbar=%1%%, ждите %2
Russian.remains=Осталось ждать: %1
Russian.LongTime=вечно
Russian.ending=завершение...
Russian.hour= час(а)
Russian.min= мин
Russian.sec= сек
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: D:\Game\BloodRayne 2\br2.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\game.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\manual.pdf; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\game.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\LANGUAGE.pod; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\cutscene.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\debuglog.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\readme.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\game.url; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\publisher.url; DestDir: {app}; Flags: ignoreversion
Source: D:\Game\BloodRayne 2\stderr.txt; DestDir: {app}; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: {group}\BloodRayne 2; Filename: {app}\br2.exe
Name: {commondesktop}\BloodRayne 2; Filename: {app}\br2.exe; Tasks: desktopicon
[Run]
Filename: {app}\br2.exe; Description: {cm:LaunchProgram,BloodRayne 2}; Flags: nowait postinstall skipifsilent
[Code]
const
Archives = '{src}\*.arc';
PM_REMOVE = 1;
CP_ACP = 0; CP_UTF8 = 65001;
oneMb = 1048576;
type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif
TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;
TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; OrigSize: Integer; Size: Extended; end;
var
ExtractFile: TLabel;
lblExtractFileName: TLabel;
btnCancelUnpacking: TButton;
CancelCode, n, UnPackError, StartInstall: Integer;
Arcs: array of TArc;
msgError: string;
lastMb: Integer;
baseMb: Integer;
totalUncompressedSize: Integer; // total uncompressed size of archive data in mb
LastTimerEvent: DWORD;
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';
function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
SetLength(Result, Length(Result)-1);
End;
function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;
Function Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo;
if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;
// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
nRet:= OemToChar( strSource, Result );
end;
// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
nRet : integer;
WideCharBuf: string;
MultiByteBuf: string;
begin
strSource:= strSource + chr(0);
SetLength( WideCharBuf, Length( strSource ) * 2 );
SetLength( MultiByteBuf, Length( strSource ) * 2 );
nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
Result:= MultiByteBuf;
end;
// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;
var origsize: Integer;
// The callback function for getting info about FreeArc archive
function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
if string(what)='origsize' then origsize := Mb else
if string(what)='compsize' then else
if string(what)='total_files' then else
Result:= CancelCode;
end;
// Returns decompressed size of files in archive
function ArchiveOrigSize(arcname: string): Integer;
var
callback: longword;
Begin
callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
except
Result:= -63; // ArcFail
end;
end;
// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
FSR: TFindRec;
Begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR) then begin
try
repeat
// Skip everything but the folders
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);
// Expand the folder list
SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
until not FindNext(FSR);
finally
FindClose(FSR);
end;
end;
End;
// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;
// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
if detail {hh:mm:ss format} then
Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
else if Ticks/3600 >= 1000 {more than hour} then
Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
else if Ticks/60 >= 1000 {1..60 minutes} then
Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
else Result:= IntToStr(Ticks/1000) +s {less than one minute}
End;
// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Remaining: Integer;
s: String;
begin
if GetTickCount - LastTimerEvent > 1000 then begin
// This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
// ....
// End of code executed by timer
LastTimerEvent := LastTimerEvent+1000;
end;
if string(what)='filename' then begin
// Update FileName label
lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
// Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb;
Mb := baseMb+Mb;
// Update progress bar
WizardForm.ProgressGauge.Position:= Mb;
// Show how much megabytes/archives were processed up to the moment
percents:= (Mb*1000) div totalUncompressedSize;
s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
if GetArrayLength(Arcs)>1 then
s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
ExtractFile.Caption := s
// Calculate and show current percents
percents:= (Mb*1000) div totalUncompressedSize;
s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
s:= s + '. '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
end;
WizardForm.FileNameLabel.Caption := s
end;
AppProcessMessage;
Result:= CancelCode;
end;
// Extracts all found archives
function UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Display 'Extracting FreeArc archive'
lblExtractFileName.Caption:= '';
lblExtractFileName.Show;
ExtractFile.caption:= cm('ArcTitle');
ExtractFile.Show;
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Position:= 0;
// Get the size of all archives
totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= totalUncompressedSize;
// Other initializations
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
StartInstall:= GetTickCount; {время начала распаковки}
LastTimerEvent:= GetTickCount;
baseMb:= 0
for n:= 0 to GetArrayLength(Arcs) -1 do
begin
lastMb := 0
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
except
Result:= -63; // ArcFail
end;
baseMb:= baseMb+lastMb
// Error occured
if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformation, MB_OK); //сообщение показывается на странице завершения
Log(msgError);
Break; //прервать цикл распаковки
end;
end;
// Hide labels and button
WizardForm.FileNameLabel.Caption:= '';
lblExtractFileName.Hide;
ExtractFile.Hide;
btnCancelUnpacking.Hide;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
else
begin
// Error occured, uninstall it then
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
end;
end;
end;
// стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extraction was unsuccessful (распаковщик вернул ошибку)
// Show error message
WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
end;
End;
procedure InitializeWizard();
begin
with WizardForm.ProgressGauge do
begin
// Create a label to show current FileName being extracted
lblExtractFileName:= TLabel.Create(WizardForm);
lblExtractFileName.parent:=WizardForm.InstallingPage;
lblExtractFileName.autosize:=false;
lblExtractFileName.Width:= Width;
lblExtractFileName.top:=Top + ScaleY(35);
lblExtractFileName.Caption:= '';
lblExtractFileName.Hide;
// Create a label to show percentage
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width:= Width;
ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
ExtractFile.caption:= '';
ExtractFile.Hide;
end;
// Create a 'Cancel unpacking' button and hide it for now.
btnCancelUnpacking:=TButton.create(WizardForm);
btnCancelUnpacking.Parent:= WizardForm;
btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
btnCancelUnpacking.Hide;
end;
YURSHAT, A1EXXX, спасибо попробую
Ошибка вот в этой строке
Source: {src}\*.arc; DestDir: {app}; Flags: external dontcopy; Components: English
Как можно исправить?
http://i079.radikal.ru/0912/b3/a2c7cebe0439.png
Inno Setup Compiler [ANSI] Beta 2 (build 091218) English (http://restools.hanzify.org/inno/InnoCompiler_ANSI_BETA2_091218_English(7zip).zip) by Restools (http://restools.hanzify.org/)
В чём крутизна новой версии (Beta & Beta 2):
http://s56.radikal.ru/i154/0912/08/2d6754c847b7t.jpg (http://radikal.ru/F/s56.radikal.ru/i154/0912/08/2d6754c847b7.png.html)
А с моей проблемой кто-нибудь поможет?
Dark Engel
18-12-2009, 18:11
Код:
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Hide;
end; »
Тоже самое :(
Dark Engel, Вы верно что-то напутали! Эти строки нужно добавлять в секцию
пример
[CODE][_Code]
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Hide;
end;
Молодой,
Ошибка вот в этой строке
Source: {src}\*.arc; DestDir: {app}; Flags: external dontcopy; Components: English »
В этой строке нет никакого смысла (если ты, конечно, не собираешься зачем-то скопировать архивы в директорию с игрой).
Расположение архивов обозначено ниже: Archives = '{src}\*.arc';. Ну и судя по приписанному Components, ты задумал сделать игру двуязычной... Для подобного файлы перевода лучше не паковать в arc'и, а записывать отдельно в [Files] и связывать с Components...
Dark Engel, покажи скрипт целиком, а то гадать что к чему можно вечно...
Dark Engel
18-12-2009, 19:09
Dark Engel, Вы верно что-то напутали! Эти строки нужно добавлять в секцию »
В нее и добавляю. Но что то никак. Вот сам скрипт подскажите куда добавить. (Прошу прощения за *** вынужден не афишировать программу.)
[CODE];Глобальные переменные
#define MyAppName "***"
#define MyAppVerName "***"
#define MyAppPublisher "***"
#define MyAppExeName "***.exe"
;Подключение шаблона скина скина
[ISPP]
#define SkinFile "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter\strait.skf"
#define SkinFolder "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter"
#include SkinFolder + "\SkinCrafter.inc"
[Setup]
AppId={{BE611A8E-150F-4A38-ADAB-DC1E7BF2A8B8}
;Имя программы.
AppName={#MyAppName}
;имя с версией.
AppVerName={#MyAppVerName}
;Издатель.
AppPublisher={#MyAppPublisher}
;Версия сборки.
VersionInfoVersion=1.1.3
;Путь установки.
DefaultDirName={pf}\***
;Отключение выбора пути установки.
DisableDirPage=yes
;Имя группы в меню.
DefaultGroupName={#MyAppName}
;Отключение запроса имени группы.
DisableProgramGroupPage=yes
;Отключение страницы "Все готово к установке".
DisableReadyPage=yes
;Путь сборки инсталятора.
OutputDir=D:\Fup\***\Output
;Имя фаила инсталяции.
OutputBaseFilename=***Setup
;Скин инсталятора.
WizardImageFile=Left.bmp
WizardSmallImageFile=Up.bmp
;Иконка инсталятора.
SetupIconFile=Setup.ico
;Уровень сжатия инсталятора.
Compression=lzma/ultra
SolidCompression=yes
;Запрет кнопки "Отмена" во время установки.
AllowCancelDuringInstall=no
;Минимальная версия Windows для установки.
MinVersion=4.0,5.01
[Languages]
;Язык установки.
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
;Создание ярлыка.
;Файлы для упаковки в инсталятор.
[Files]
;Служебные файлы инсталятора.
Source: Wallpaper.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: Sound.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
;Файлы для установки.
Source: ***
[Icons]
;Пункты меню в группе.
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
[Messages]
;Оформление инсталятора.
BeveledLabel=---***---
;Удаление ключа реестра при деинсталяции.
[Registry]
Root: HKLM; Subkey: Software\***; ValueType: dword; ValueName: ***; Flags: dontcreatekey uninsdeletevalue; ValueData: 3
;Удаление файла настроек при деинсталяции.
[UninstallDelete]
Name: {app}\***.ini; Type: files
;Блок кода. Запуск музыки, проверка версии, скин.
[Code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;
function InitializeSetup1:boolean;
begin
ExtractTemporaryFile('Sound.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\Sound.mp3');
CurrentMP3:=0;
Result:=True;
end;
procedure InitializeWizard1;
begin
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('Wallpaper.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\Wallpaper.jpg');
end;
procedure DeinitializeSetup1;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ssDeInitialize;
end;
//Настройка подключения к серверу.
procedure MyAfterInstall();
var
I: String;
begin
if RegQueryStringValue(HKCU, '***', 'DefaultSystem', I)
then
SaveStringToFile('C:\Program Files\***.ini', I, true);
SaveStringToFile('C:\Program Files\***.ini', #13#10 + 'true', true);
end;
//проверка на установленность и версию.
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
Names: TArrayOfString;
ResultDWord: Cardinal;
i: Integer;
msg: string;
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for i:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[i]) then
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[i], ResultDWord);
if ResultDWord > ver then
begin
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end
else
if ResultDWord = ver then
begin
Result:= True;
end;
Break;
end;
end;
//Запись версии устанавливаемой программы.
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', '***', 3);
end;
function InitializeSetup2(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall('***', 3);
end;
//Проверка версии ***
function DetectInstall1(ProgName: string; ver: string): Boolean;
var
Names: TArrayOfString;
o: Integer;
ResultStr, msg: string;
begin
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\***') then
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for o:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[o]) then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[o], ResultStr);
if ResultStr = ver then
begin
Result:= True;
end
else
begin
msg:= 'Установлена версия *** для ***.' #13#10 + 'Продолжение установки невозможно.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
Break;
end;
end;
end
else
begin
msg:= '*** не установлен.' #13#10 + 'Дальнейшая установка невозможна.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
end;
function InitializeSetup3(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall1('Current***Level', '***');
end;
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
Result := InitializeSetup2(); if not Result then exit;
Result := InitializeSetup3(); if not Result then exit;
end;
procedure InitializeWizard();
begin
InitializeWizard1();
SkinCrafter_InitializeWizard();
end;
procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;
//Подключение скина.
var Rect: TRect; hIcon: LongInt;
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth, cyWidth: Integer; istepIfAniCur, hbrFlickerFreeDraw, diFlags: LongInt): LongInt; external 'DrawIconEx@user32.dll stdcall';
function LoadImage(hInst: LongInt; lpszExeFileName: PChar; uType: DWord; cxDesired, cyDesired: LongInt; fuLoad: DWord): hWnd; external 'LoadImageA@user32.dll stdcall';
function LoadBitmap(hInst: LongInt; lpBitmapName: PChar): HBITMAP; external 'LoadBitmapA@user32.dll stdcall';
Dark Engel, попробуй это (через InitializeWizard): ;Глобальные переменные
#define MyAppName "***"
#define MyAppVerName "***"
#define MyAppPublisher "***"
#define MyAppExeName "***.exe"
;Подключение шаблона скина скина
[ISPP]
#define SkinFile "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter\strait.skf"
#define SkinFolder "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter"
#include SkinFolder + "\SkinCrafter.inc"
[Setup]
AppId={{BE611A8E-150F-4A38-ADAB-DC1E7BF2A8B8}
;Имя программы.
AppName={#MyAppName}
;имя с версией.
AppVerName={#MyAppVerName}
;Издатель.
AppPublisher={#MyAppPublisher}
;Версия сборки.
VersionInfoVersion=1.1.3
;Путь установки.
DefaultDirName={pf}\***
;Отключение выбора пути установки.
DisableDirPage=yes
;Имя группы в меню.
DefaultGroupName={#MyAppName}
;Отключение запроса имени группы.
DisableProgramGroupPage=yes
;Отключение страницы "Все готово к установке".
DisableReadyPage=yes
;Путь сборки инсталятора.
OutputDir=D:\Fup\***\Output
;Имя фаила инсталяции.
OutputBaseFilename=***Setup
;Скин инсталятора.
WizardImageFile=Left.bmp
WizardSmallImageFile=Up.bmp
;Иконка инсталятора.
SetupIconFile=Setup.ico
;Уровень сжатия инсталятора.
Compression=lzma/ultra
SolidCompression=yes
;Запрет кнопки "Отмена" во время установки.
AllowCancelDuringInstall=no
;Минимальная версия Windows для установки.
MinVersion=4.0,5.01
[Languages]
;Язык установки.
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
;Создание ярлыка.
;Файлы для упаковки в инсталятор.
[Files]
;Служебные файлы инсталятора.
Source: Wallpaper.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: Sound.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
;Файлы для установки.
Source: ***
[Icons]
;Пункты меню в группе.
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
[Messages]
;Оформление инсталятора.
BeveledLabel=---***---
;Удаление ключа реестра при деинсталяции.
[Registry]
Root: HKLM; Subkey: Software\***; ValueType: dword; ValueName: ***; Flags: dontcreatekey uninsdeletevalue; ValueData: 3
;Удаление файла настроек при деинсталяции.
[UninstallDelete]
Name: {app}\***.ini; Type: files
;Блок кода. Запуск музыки, проверка версии, скин.
[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;
function InitializeSetup1:boolean;
begin
ExtractTemporaryFile('Sound.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\Sound.mp3');
CurrentMP3:=0;
Result:=True;
end;
procedure InitializeWizard1;
begin
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('Wallpaper.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\Wallpaper.jpg');
end;
procedure DeinitializeSetup1;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ssDeInitialize;
end;
//Настройка подключения к серверу.
procedure MyAfterInstall();
var
I: String;
begin
if RegQueryStringValue(HKCU, '***', 'DefaultSystem', I)
then
SaveStringToFile('C:\Program Files\***.ini', I, true);
SaveStringToFile('C:\Program Files\***.ini', #13#10 + 'true', true);
end;
//проверка на установленность и версию.
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
Names: TArrayOfString;
ResultDWord: Cardinal;
i: Integer;
msg: string;
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for i:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[i]) then
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[i], ResultDWord);
if ResultDWord > ver then
begin
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end
else
if ResultDWord = ver then
begin
Result:= True;
end;
Break;
end;
end;
//Запись версии устанавливаемой программы.
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', '***', 3);
end;
function InitializeSetup2(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall('***', 3);
end;
//Проверка версии ***
function DetectInstall1(ProgName: string; ver: string): Boolean;
var
Names: TArrayOfString;
o: Integer;
ResultStr, msg: string;
begin
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\***') then
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for o:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[o]) then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[o], ResultStr);
if ResultStr = ver then
begin
Result:= True;
end
else
begin
msg:= 'Установлена версия *** для ***.' #13#10 + 'Продолжение установки невозможно.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
Break;
end;
end;
end
else
begin
msg:= '*** не установлен.' #13#10 + 'Дальнейшая установка невозможна.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
end;
function InitializeSetup3(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall1('Current***Level', '***');
end;
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
Result := InitializeSetup2(); if not Result then exit;
Result := InitializeSetup3(); if not Result then exit;
end;
procedure InitializeWizard();
begin
InitializeWizard1();
SkinCrafter_InitializeWizard();
WizardForm.FilenameLabel.Hide();
end;
procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;
//Подключение скина.
var Rect: TRect; hIcon: LongInt;
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth, cyWidth: Integer; istepIfAniCur, hbrFlickerFreeDraw, diFlags: LongInt): LongInt; external 'DrawIconEx@user32.dll stdcall';
function LoadImage(hInst: LongInt; lpszExeFileName: PChar; uType: DWord; cxDesired, cyDesired: LongInt; fuLoad: DWord): hWnd; external 'LoadImageA@user32.dll stdcall';
function LoadBitmap(hInst: LongInt; lpBitmapName: PChar): HBITMAP; external 'LoadBitmapA@user32.dll stdcall';
или это (через CurPageChanged): ;Глобальные переменные
#define MyAppName "***"
#define MyAppVerName "***"
#define MyAppPublisher "***"
#define MyAppExeName "***.exe"
;Подключение шаблона скина скина
[ISPP]
#define SkinFile "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter\strait.skf"
#define SkinFolder "C:\Program Files\HiSoft\Inno Script Generator\Include\SkinCrafter"
#include SkinFolder + "\SkinCrafter.inc"
[Setup]
AppId={{BE611A8E-150F-4A38-ADAB-DC1E7BF2A8B8}
;Имя программы.
AppName={#MyAppName}
;имя с версией.
AppVerName={#MyAppVerName}
;Издатель.
AppPublisher={#MyAppPublisher}
;Версия сборки.
VersionInfoVersion=1.1.3
;Путь установки.
DefaultDirName={pf}\***
;Отключение выбора пути установки.
DisableDirPage=yes
;Имя группы в меню.
DefaultGroupName={#MyAppName}
;Отключение запроса имени группы.
DisableProgramGroupPage=yes
;Отключение страницы "Все готово к установке".
DisableReadyPage=yes
;Путь сборки инсталятора.
OutputDir=D:\Fup\***\Output
;Имя фаила инсталяции.
OutputBaseFilename=***Setup
;Скин инсталятора.
WizardImageFile=Left.bmp
WizardSmallImageFile=Up.bmp
;Иконка инсталятора.
SetupIconFile=Setup.ico
;Уровень сжатия инсталятора.
Compression=lzma/ultra
SolidCompression=yes
;Запрет кнопки "Отмена" во время установки.
AllowCancelDuringInstall=no
;Минимальная версия Windows для установки.
MinVersion=4.0,5.01
[Languages]
;Язык установки.
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
;Создание ярлыка.
;Файлы для упаковки в инсталятор.
[Files]
;Служебные файлы инсталятора.
Source: Wallpaper.jpg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: Sound.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
;Файлы для установки.
Source: ***
[Icons]
;Пункты меню в группе.
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Comment: ***
[Messages]
;Оформление инсталятора.
BeveledLabel=---***---
;Удаление ключа реестра при деинсталяции.
[Registry]
Root: HKLM; Subkey: Software\***; ValueType: dword; ValueName: ***; Flags: dontcreatekey uninsdeletevalue; ValueData: 3
;Удаление файла настроек при деинсталяции.
[UninstallDelete]
Name: {app}\***.ini; Type: files
;Блок кода. Запуск музыки, проверка версии, скин.
[code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;
function InitializeSetup1:boolean;
begin
ExtractTemporaryFile('Sound.mp3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\Sound.mp3');
CurrentMP3:=0;
Result:=True;
end;
procedure InitializeWizard1;
begin
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('Wallpaper.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\Wallpaper.jpg');
end;
procedure DeinitializeSetup1;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ssDeInitialize;
end;
//Настройка подключения к серверу.
procedure MyAfterInstall();
var
I: String;
begin
if RegQueryStringValue(HKCU, '***', 'DefaultSystem', I)
then
SaveStringToFile('C:\Program Files\***.ini', I, true);
SaveStringToFile('C:\Program Files\***.ini', #13#10 + 'true', true);
end;
//проверка на установленность и версию.
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
Names: TArrayOfString;
ResultDWord: Cardinal;
i: Integer;
msg: string;
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for i:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[i]) then
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[i], ResultDWord);
if ResultDWord > ver then
begin
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end
else
if ResultDWord = ver then
begin
Result:= True;
end;
Break;
end;
end;
//Запись версии устанавливаемой программы.
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'Software\***', '***', 3);
end;
function InitializeSetup2(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall('***', 3);
end;
//Проверка версии ***
function DetectInstall1(ProgName: string; ver: string): Boolean;
var
Names: TArrayOfString;
o: Integer;
ResultStr, msg: string;
begin
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\***') then
begin
Result:= True;
if RegGetValueNames(HKEY_LOCAL_MACHINE, 'Software\***', Names) then
begin
for o:= 0 to GetArrayLength(Names)-1 do
if Lowercase(ProgName) = Lowercase(Names[o]) then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\***', Names[o], ResultStr);
if ResultStr = ver then
begin
Result:= True;
end
else
begin
msg:= 'Установлена версия *** для ***.' #13#10 + 'Продолжение установки невозможно.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
Break;
end;
end;
end
else
begin
msg:= '*** не установлен.' #13#10 + 'Дальнейшая установка невозможна.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end;
end;
function InitializeSetup3(): Boolean;
begin
// Имя программы и версия для проверки.
Result:= DetectInstall1('Current***Level', '***');
end;
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
Result := InitializeSetup2(); if not Result then exit;
Result := InitializeSetup3(); if not Result then exit;
end;
procedure InitializeWizard();
begin
InitializeWizard1();
SkinCrafter_InitializeWizard();
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID=wpInstalling then
WizardForm.FileNameLabel.Hide;
end;
procedure DeinitializeSetup();
begin
DeinitializeSetup1();
end;
//Подключение скина.
var Rect: TRect; hIcon: LongInt;
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth, cyWidth: Integer; istepIfAniCur, hbrFlickerFreeDraw, diFlags: LongInt): LongInt; external 'DrawIconEx@user32.dll stdcall';
function LoadImage(hInst: LongInt; lpszExeFileName: PChar; uType: DWord; cxDesired, cyDesired: LongInt; fuLoad: DWord): hWnd; external 'LoadImageA@user32.dll stdcall';
function LoadBitmap(hInst: LongInt; lpBitmapName: PChar): HBITMAP; external 'LoadBitmapA@user32.dll stdcall';
Dark Engel
18-12-2009, 19:40
A1EXXX, Огромное спасибо второй метод сработал на ура.
Остался второй вопрос.
Как убрать во время распаковки файлов извещение какие файлы и куда распаковываются. Оставить только надпись "идет распаковка". (Или хотя бы не показывать их при silent/verysilent установке)
Dark Engel, О_о, если ты об этом (http://i082.radikal.ru/0912/0b/f8d97fa5b10b.png), то как раз это я и убирал в убоих случаях....
ADremLIN
18-12-2009, 22:56
Уважаемые знатоки (с).
Решил сделать для себя табличку, отображающую порядок возникновения событий в процессе инсталляции. При подготовки таблицы я использовал переведенный на русский хелп по Inno Setup version 5.1.8.
Вот что у меня получилось. Прошу вас поправить меня, если я где-то, что-то перепутал.
http://www.fileden.com/files/2009/9/18/2578776/Before.gif
http://www.fileden.com/files/2009/9/18/2578776/Insall.gif
http://www.fileden.com/files/2009/9/18/2578776/After.gif
В виде Excel-файла: (http://www.fileden.com/files/2009/9/18/2578776/InstallOrder.xls)
Нигде не нашел информации, чем отличается ssPreInstall от ssInstall [Добавлено] Упс. Нашел ;)
Для чего мне нужна эта таблица этапов инсталляции?
Просто у меня возник вопрос, связанный с тем, что инсталятор не корректно обновляет внесенные изменения в системный %PATH%. (при включенном ChangesEnvironment=yes).
В обработчике какого события, или на каком шаге инсталяции, мне нужно изменить системный %PATH%, чтобы выполнить задачу из секции [Run] c флагом postinstall, с учетом новых путей?
Поэтому прошу уважаемый форум:
Во-первых утвердить (поправить и утвердить) мою таблицу (Сомневаюсь №35 <-> №36);
Во-вторых помочь с моей проблемой (продолжение см. ниже);
Dark Engel
19-12-2009, 12:57
A1EXXX, У-у-п-с ошибся. Мне нужно убрать при silent установке окошки типа "Дальнейшая установка невозможна" См скрипт.
begin
msg:= 'Установленная версия *** новее.';
Result:= False;
MsgBox(msg, mbInformation, MB_OK);
end
ADremLIN
19-12-2009, 13:16
Продолжение (начало см. выше):
То есть, в общих чертах, образовалась такая проблема:
Свежеустановленная инсталлятором программа запускается в секции [Run] c флагом postinstall.
Она использует новые, только что зарегистрированные, пути для поиска необходимых для работы *.dll файлов.
Но инсталлятор, сообщая другим оконным приложениям windows об изменении "environment", похоже не обновляет эти изменения сам у себя.
А так как родителем любых процессов (приложений), запускаемых инсталлятором, является сам инсталлятор, то они (запускаемые приложения) не видят новых путей (обновленных значений других переменных окружения виндовс).
По-моему так. Поправьте меня, если я не прав...
Уже просто разбил стену лбом, но ответа так и нет.
Пример, демонстрирующий описанную проблему с %PATH% (http://www.fileden.com/files/2009/9/18/2578776/example_env_err.zip)
Пояснения:
Инсталлятор добавляет новые пути в %PATH%:
'{app}\bin1'
'{app}\bin2'
ChangesEnvironment=yes;
При выходе, инсталлятор запускает bat'ничек (секция [Run] c флагом postinstall) с командой SET PATH внутри, для просмотра значений системной переменной %PATH%, и ждет закрытия окна консоли.
И я не вижу здесь (в окне консоли, открытой из инсталлятора) никаких изменений в переменных окружения...
Если, не закрывая окна консоли, открытой инсталлятором, открыть новую консоль и ввести руками туже команду: SET PATH, то я вижу новые пути в переменной...
http://www.fileden.com/files/2009/9/18/2578776/ExampleScreen01_thumb.gif (http://www.fileden.com/files/2009/9/18/2578776/ExampleScreen01.gif)
НИЧЕГО НЕ ПОНИМАЮ!!!
Это БАГ Inno Setup'а, или я что-то не так делаю???
Если - это баг, то существует ли способ его обойти???
Спасибо за внимание.
ЗЫ:
Я уже сталкивался с этой проблемой ранее (http://forum.oszone.net/post-1267417-388.html), получил ответ (http://forum.oszone.net/post-1267767-390.html), но разрешить проблему так и не удалось... Поэтому и начал копать сам...
Помогите пожалуйста как исправить ,я поставил кнопки которые прилогались к черному фону,кнопка работает только при нажатии на текст в кнопке а не на сому кнопку.буду благодарен
Всем доброго времени суток, подскажите где в скрипте распаковки FR указать "требуемое место для распаковки"
Не могу найти строку, заранее благодарен!
Всем доброго времени суток, подскажите где в скрипте распаковки FR указать "требуемое место для распаковки" »
А что значит FR?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.