PDA

Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [36] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Молодой
18-12-2009, 16:01
Я это исправил, куда же мне архивы указывать?

A1EXXX
18-12-2009, 16:07
Молодой, никуда их указывать не нужно, просто ложи их рядом с setup.exe и они распакуются. Кстати, ты используешь не тот код, который просил...

YURSHAT
18-12-2009, 16:10
[Молодой, если тебе нужно два прогресс бара нужно использовать код FreeArc Example Ext

A1EXXX
18-12-2009, 16:14
Молодой, поправил тебе [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;

Молодой
18-12-2009, 16:15
YURSHAT, A1EXXX, спасибо попробую

Ошибка вот в этой строке
Source: {src}\*.arc; DestDir: {app}; Flags: external dontcopy; Components: English

Как можно исправить?
http://i079.radikal.ru/0912/b3/a2c7cebe0439.png

A1EXXX
18-12-2009, 17:09
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)

Молодой
18-12-2009, 17:31
А с моей проблемой кто-нибудь поможет?

Dark Engel
18-12-2009, 18:11
Код:
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Hide;
end; »

Тоже самое :(

YURSHAT
18-12-2009, 18:57
Dark Engel, Вы верно что-то напутали! Эти строки нужно добавлять в секцию
пример
[CODE][_Code]
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Hide;
end;

A1EXXX
18-12-2009, 19:04
Молодой,
Ошибка вот в этой строке
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';

A1EXXX
18-12-2009, 19:28
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 установке)

A1EXXX
18-12-2009, 19:50
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), но разрешить проблему так и не удалось... Поэтому и начал копать сам...

REXE
19-12-2009, 19:50
Помогите пожалуйста как исправить ,я поставил кнопки которые прилогались к черному фону,кнопка работает только при нажатии на текст в кнопке а не на сому кнопку.буду благодарен

Молодой
20-12-2009, 12:06
Всем доброго времени суток, подскажите где в скрипте распаковки FR указать "требуемое место для распаковки"
Не могу найти строку, заранее благодарен!

YURSHAT
20-12-2009, 12:41
Всем доброго времени суток, подскажите где в скрипте распаковки FR указать "требуемое место для распаковки" »
А что значит FR?




© OSzone.net 2001-2012