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

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

Автор: Artem_Butenko
Дата сообщения: 31.07.2008 10:52
Добрый день. AlexandP, постараюсь Вам помочь. Слепок системного реестра до и после установки приложения, можно получить с помощью программы RegShot 2.0 Unicode (ее ранняя версия есть в руководстве Kindly версии 5.1). Для экспорта .reg-ключей в формат Inno Setup, используйте ISTool. Более подробная инструкция по синтаксису секции [Registry] см. руководства Kindly + файл-справку по Inno Setup от Bagira. Большое им за это спасибо!
Автор: Victor_Dobrov
Дата сообщения: 31.07.2008 10:53
Genri - а вариант с [more=паузой и запуском анимации]
[Setup]
AppName=WaitProgress
AppVerName=WaitProgress
CreateAppDir=false
OutputDir=.

[Files]
Source: Waiting.avi; DestDir: {tmp}; DestName: WaitProgress.avi; Flags: dontcopy

[Code]
type
    TagMonitorInfo = record cbSize: DWord; Monitor, Work: TRect; dwFlags: DWord; end;
var
    WaitForm: TForm; n: Integer; MonitorInfo: TagMonitorInfo;
const
    AviFrameWidth=272; AviFrameHeight=60; FormLeft=100; FormTop=100;

function GetMonitorInfo(hMonitor: Integer; var lpMonitorInfo: TagMonitorInfo): Boolean; external 'GetMonitorInfoA@user32';
function mciSendString(lpstrCommand, lpstrReturnString: PChar; uReturnLength, hWndCallback: Integer): Integer; external 'mciSendStringA@winmm stdcall delayload';

Procedure DeinitializeSetup;
Begin
    mciSendString('Close Background','',0,0)
End;

Procedure WaitFormClose(Sender: TObject; var Action: TCloseAction);
Begin
    DeinitializeSetup
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID = wpWelcome then mciSendString('pause Background','',0,0)
    if CurPageID = wpInstalling then begin mciSendString('resume Background','',0,0) Sleep(3600) end;
    if CurPageID = wpFinished then mciSendString('stop Background','',0,0)
End;

Function InitializeSetup: Boolean;
Begin
    ExtractTemporaryFile('WaitProgress.avi')
    MonitorInfo.cbSize:= SizeOf(MonitorInfo); GetMonitorInfo(1, MonitorInfo)
WaitForm:= TForm.Create(nil);
    WaitForm.OnClose:= @WaitFormClose
    WaitForm.ClientWidth:= AviFrameWidth; WaitForm.ClientHeight:= AviFrameHeight
    WaitForm.Left:= trunc((MonitorInfo.Work.Right - WaitForm.Width)/100 * FormLeft)
    WaitForm.Top:= trunc((MonitorInfo.Work.Bottom - WaitForm.Height)/100 * FormTop)
    WaitForm.Caption:= 'Please wait...';
    WaitForm.Show
mciSendString('open '+ ExpandConstant('{tmp}\WaitProgress.avi') +' type AVIVideo alias Background parent '+ IntToStr(WaitForm.Handle) +' style child','',0,0)
    mciSendString('put Background window at 0 0 '+ IntToStr(WaitForm.ClientWidth) +' '+ IntToStr(WaitForm.ClientHeight),'',0,0)
    mciSendString('play Background repeat','',0,0)    { проигрывание анимации не останавливает выполнение скрипта}
//    for n:= 1 to 10 do begin    { цикл дан для примера, вставьте здесь свой код}
//        Sleep(2000)
//        WaitForm.Caption:= 'Extracting file '+IntToStr(n);
//    end;
//        mciSendString('Close Background','',0,0)
//        WaitForm.Free;
    Sleep(1800)
    Result:= true;
End;
[/more] подойдёт? Только авишку желательно сделать более похожей на прогрессбар.
Автор: Artem_Butenko
Дата сообщения: 31.07.2008 11:28
Здравствуйте уважаемый Виктор Добров, прошу извинить меня за назойливость. Но, если Вам не сложно, пожалуйста приведите отдельно от "Corona Skin" примеры скриптов: а) реализации озвучки клика по кнопке (.wav); б) реализации расширенного прогресс-бара. Вы используете препроцессор, для меня это несколько сложно, ведь я еще только начал глубоко познавать Inno Setup. Буду искренне признателен за Вашу помощь!
Автор: Genri
Дата сообщения: 31.07.2008 13:40
Victor_Dobrov -- да в принципе оба варианта хороши. Но в некоторых случаях внешний екзешник предпочтительней. Зависит от того, в какой момент нужен этот прогрессбар.
Два варианта, [more=скрипт]
[Setup]
AppName=WaitProgress
AppVerName=WaitProgress
CreateAppDir=false
OutputDir=.

[Files]
Source: Waiting.avi; DestDir: {tmp}; DestName: WaitProgress.avi; Flags: dontcopy

[_Code]
type
TagMonitorInfo = record cbSize: DWord; Monitor, Work: TRect; dwFlags: DWord; end;
var
WaitForm: TForm; n: Integer; MonitorInfo: TagMonitorInfo;
ResultCode: Integer;

const
AviFrameWidth=272; AviFrameHeight=60; FormLeft=100; FormTop=100;

function GetMonitorInfo(hMonitor: Integer; var lpMonitorInfo: TagMonitorInfo): Boolean; external 'GetMonitorInfoA@user32';
function mciSendString(lpstrCommand, lpstrReturnString: PChar; uReturnLength, hWndCallback: Integer): Integer; external 'mciSendStringA@winmm stdcall delayload';

Procedure DeinitializeSetup;
Begin
mciSendString('Close Background','',0,0)
End;

Procedure WaitFormClose(Sender: TObject; var Action: TCloseAction);
Begin
DeinitializeSetup
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpWelcome then mciSendString('pause Background','',0,0)
if CurPageID = wpInstalling then mciSendString('resume Background','',0,0)
End;

Function InitializeSetup: Boolean;
Begin
ExtractTemporaryFile('WaitProgress.avi')
MonitorInfo.cbSize:= SizeOf(MonitorInfo); GetMonitorInfo(1, MonitorInfo)
WaitForm:= TForm.Create(nil);
WaitForm.OnClose:= @WaitFormClose
WaitForm.ClientWidth:= AviFrameWidth; WaitForm.ClientHeight:= AviFrameHeight
WaitForm.Left:= trunc((MonitorInfo.Work.Right - WaitForm.Width)/100 * FormLeft)
WaitForm.Top:= trunc((MonitorInfo.Work.Bottom - WaitForm.Height)/100 * FormTop)
WaitForm.Caption:= 'Please wait...';
WaitForm.Show
mciSendString('open '+ ExpandConstant('{tmp}\WaitProgress.avi') +' type AVIVideo alias Background parent '+ IntToStr(WaitForm.Handle) +' style child','',0,0)
mciSendString('put Background window at 0 0 '+ IntToStr(WaitForm.ClientWidth) +' '+ IntToStr(WaitForm.ClientHeight),'',0,0)
mciSendString('play Background repeat','',0,0) { проигрывание анимации не останавливает выполнение скрипта}
// for n:= 1 to 10 do begin { цикл дан для примера, вставьте здесь свой код}
// Sleep(2000)
// WaitForm.Caption:= 'Extracting file '+IntToStr(n);
// end;
// mciSendString('Close Background','',0,0)
// WaitForm.Free;
Result:= Exec('cmd', '/C ping -n 10 localhost', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode)
End; [/more] на основании твоего кода и [more=скрипт]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "wait.exe"; Flags: dontcopy
Source: "closewait.exe"; Flags: dontcopy

[_Code]
var
ResultCode: Integer;

function InitializeSetup: Boolean;
begin
ExtractTemporaryFile('wait.exe');
ExtractTemporaryFile('closewait.exe');
Exec(ExpandConstant('{tmp}\wait.exe'), '', '', SW_SHOW,
ewNoWait, ResultCode)
Result:= Exec('cmd', '/C ping -n 10 localhost', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
Exec(ExpandConstant('{tmp}\closewait.exe'), '', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode)
end; [/more] на основании файлов ExpeditorR. Инсталлятор ожидает окончания выполнения пинга (просто для примера, в реальном скрипте в этом месте будет любой длительный процесс). Так как нужен результат этого процесса, для него ewNoWait ставить нельзя (а иначе и прогрессбар не нужен). На мой взгляд, второй вариант предпочтительней. Ну а в других ситуациях, твой может быть лучше.
Автор: Diawer
Дата сообщения: 31.07.2008 14:50
Помогите с моим [more=вопросом]

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[Tasks]
Name: askini; Description: Указать расположение файла регистрации; GroupDescription: Регистрация программы:

[Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Регистрация игры', 'Указать расположение файла регистрации игры?',
'Выберите расположение файла регистрации игры, после этого' #13 'нажмите «Далее»:');
Page.Add('Выбор файла регистрации...', 'Legend.exe|Legend.exe', 'Legend.exe');
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if CurPage = Page.ID then
begin
if FileExists(Page.Values[0]) then
begin
//копировать Legend.exe в {app} игры с заменой уже существующего Legend.exe,
//пробовал вместо C:\123\ поставить {app}, но почемуто не получаеться
ForceDirectories('C:\123\');
Result:= FileCopy(Page.Values[0], 'C:\123\'+ ExtractFileName(Page.Values[0]), False);
end
else Result:= False;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;[/more], очень надо (срочно), это подправленный под себя
скрипт из "Коллекция скриптов - SelectAndCopyKey.iss", дело в том что копируется игра с
содержащимся в ней Legend.exe и если у пользователя есть крякнутый Legend.exe, то после его
выбора он должен перезаписывать оригинальный, но почему-то не перезаписывает.
Автор: Victor_Dobrov
Дата сообщения: 31.07.2008 14:54
Artem_Butenko

Здесь все скрипты, что у меня были. Остальное любой может взять из Corona Skin, автору разбирать свой проект не имеет смысла.
Автор: Genri
Дата сообщения: 31.07.2008 15:08
Diawer

Цитата:
копируется игра с содержащимся в ней Legend.exe
-- т.е. ты инсталлируешь игру? И в ней надо заменить файл? Т.е. заменить после того, как игра установлена? Тогда почему ты копируешь файл до установки? Т.е. ты сначала копируешь файл, а потом идет инсталляция, которая опять переписывает файл на оригинальный.


Добавлено:
В данном случае "Кто раньше встал, того и тапки" не подходит. Здесь срабатывает "Смеется тот, кто смеется последним"
Автор: Rabben
Дата сообщения: 31.07.2008 15:21
Имеется программа на английском языке, нужно сделать так, чтоб при выборе языка копировались определенные файлы (т.е. при выборе английского копировались все файлы, а при выборе русского только те, которые не влияют на язык + файлы русифицирующие программу). Помогите плз со скриптом)
Автор: Genri
Дата сообщения: 31.07.2008 16:21
Rabben


Код: [Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: MyProg.exe; DestDir: {app}
Source: MyProg.chm; DestDir: {app}; Languages: en
Source: MyDll.dll; DestDir: {app}; Languages: ru
; MyProg.exe инсталлируется в любом случае
; MyProg.chm инсталлируется только при выборе английского
; MyDll.dll инсталлируется только при выборе русского
Автор: abasov
Дата сообщения: 31.07.2008 16:56
Victor_Dobrov
Планируете сделать проверку доступности сети? Может Ping по первому TTL, достаточно будет. Если нет, возможно есть пример?

Есть код Delphi, помогите перекроить в iss


Код: //Implementing Internet Pings Using Icmp.dll

Unit ping;

Interface
Uses
Windows, SysUtils, Classes;

Type
TSunB = Packed Record
s_b1, s_b2, s_b3, s_b4: byte;
End;

TSunW = Packed Record
s_w1, s_w2: word;
End;

PIPAddr = ^TIPAddr;
TIPAddr = Record
Case integer Of
0: (S_un_b: TSunB);
1: (S_un_w: TSunW);
2: (S_addr: longword);
End;

IPAddr = TIPAddr;

Function IcmpCreateFile: THandle; stdcall; external 'icmp.dll';
Function IcmpCloseHandle(icmpHandle: THandle): boolean; stdcall; external 'icmp.dll'
Function IcmpSendEcho(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; external 'icmp.dll';


Function PingAd(InetAddress: String): boolean;

Implementation

Uses
WinSock;

Function Fetch(Var AInput: String;
Const ADelim: String = ' ';
Const ADelete: Boolean = true) : String;
Var
iPos: Integer;
Begin
If ADelim = #0 Then
Begin
// AnsiPos does not work with #0
iPos := Pos(ADelim, AInput);
End
Else
Begin
iPos := Pos(ADelim, AInput);
End;
If iPos = 0 Then
Begin
Result := AInput;
If ADelete Then
Begin
AInput := '';
End;
End
Else
Begin
result := Copy(AInput, 1, iPos - 1);
If ADelete Then
Begin
Delete(AInput, 1, iPos + Length(ADelim) - 1);
End;
End;
End;

Procedure TranslateStringToTInAddr(AIP: String; Var AInAddr);
Var
phe: PHostEnt;
pac: PChar;
GInitData: TWSAData;
Begin
WSAStartup($101, GInitData);
Try
phe := GetHostByName(PChar(AIP));
If Assigned(phe) Then
Begin
pac := phe^.h_addr_list^;
If Assigned(pac) Then
Begin
With TIPAddr(AInAddr).S_un_b Do
Begin
s_b1 := Byte(pac[0]);
s_b2 := Byte(pac[1]);
s_b3 := Byte(pac[2]);
s_b4 := Byte(pac[3]);
End;
End
Else
Begin
Raise Exception.Create('Error getting IP from HostName');
End;
End
Else
Begin
Raise Exception.Create('Error getting HostName');
End;
Except
FillChar(AInAddr, SizeOf(AInAddr), #0);
End;
WSACleanup;
End;

Function PingAd(InetAddress: String): boolean;
Var
Handle: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: Array[1..128] Of byte;
Begin
result := false;
Handle := IcmpCreateFile;
If Handle = INVALID_HANDLE_VALUE Then
Exit;
TranslateStringToTInAddr(InetAddress, InAddr);
DW := IcmpSendEcho(Handle, InAddr, Nil, 0, Nil, @rep, 128, 0);
Result := (DW <> 0);
IcmpCloseHandle(Handle);
End;

End.
Автор: doom2d
Дата сообщения: 31.07.2008 17:29
У меня тут маленькая проблема... Это мой первый код..
[more]
Код: ; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Doom Remake 3: Risen Version"
#define MyAppVerName "Doom Remake 3: Risen Version"
#define MyAppPublisher "Y-Dr. Now"
#define MyAppURL "http://www.site.ru"
#define MyAppExeName "MyProg.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{B7B472AC-0DB2-4C41-B51E-C8959EE82CCD}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
CreateAppDir=no
LicenseFile=C:\Risen3D\licen.txt
InfoBeforeFile=C:\Risen3D\Readit.txt
OutputDir=C:\Documents and Settings\Павел\Desktop
OutputBaseFilename=setup
SetupIconFile=C:\Documents and Settings\doom2d\Desktop\doom.ico
Compression=lzma
SolidCompression=yes
WindowVisible=yes
WindowResizable=no
WindowShowCaption=no

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"

[Files]
Source: "C:\Risen3D\*"; DestDir: "{win}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: C:\isxbb.dll; DestDir: {tmp}; Flags: dontcopy
//files to slideshow
Source: C:\pack\0.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\1.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\2.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\3.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\4.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\5.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\6.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\7.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\8.jpg; DestDir: {tmp}; Flags: dontcopy
Source: "C:\BASS.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "C:\pack\d_e1m1.ogg"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
const
BACKGROUND=6;
TIMER=16;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): Integer;
external 'isxbb_AddImage@files:isxbb.dll stdcall';

function isxbb_Init(hWnd: Integer): Integer;
external 'isxbb_Init@files:isxbb.dll stdcall';

function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): Integer;
external 'isxbb_StartTimer@files:isxbb.dll stdcall';

function isxbb_KillTimer(Flags: Cardinal): Integer;
external 'isxbb_KillTimer@files:isxbb.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile('1.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\1.jpg',BACKGROUND);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
//что-то начинается
if CurStep=ssInstall
then
begin
ExtractTemporaryFile('2.jpg');
ExtractTemporaryFile('3.jpg');
ExtractTemporaryFile('4.jpg');
ExtractTemporaryFile('5.jpg');
ExtractTemporaryFile('6.jpg');
ExtractTemporaryFile('7.jpg');
ExtractTemporaryFile('8.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\2.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\3.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\4.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\5.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\6.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\7.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\8.jpg',BACKGROUND or TIMER);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));

isxbb_StartTimer(2,BACKGROUND)
end

else if CurStep=ssPostInstall then
isxbb_KillTimer(BACKGROUND);
end;
const
BASS_SAMPLE_LOOP = 4;

type
HSTREAM = DWORD;

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 delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure InitializeWizard();
var
Name1: string;
    i: Integer;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('d_e1m1.ogg');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Name1:=ExpandConstant('{tmp}\d_e1m1.ogg');
i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
if i <> 0 then
    begin
BASS_ChannelPlay(i, True);
end;
end;
end;
procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=False;
Confirm:=False;
if MsgBox('Хорошенько поDOOMайте прежде чем отменить установку! Вы действительно не любите Doom?', mbError, MB_YESNO) = idYes
then
Cancel:=true;
end;


[Icons]
Name: "{commonprograms}\Doom Remake3"; Filename: "{app}\Risen3D\R3DLaunch\r3dlauncher.exe"
Автор: abasov
Дата сообщения: 31.07.2008 17:42
doom2d
http://victor-dobrov.narod.ru/InnoSetupFAQ_ru-board.chm

Коллекция скриптов и Сборник вопросов, собранных из этой и предыдущих частей топика.
Там есть ответ на твой вопрос
Автор: Diawer
Дата сообщения: 31.07.2008 18:10

Цитата:
Genri



Цитата:
-- т.е. ты инсталлируешь игру? И в ней надо заменить файл? Т.е. заменить после того, как игра установлена? Тогда почему ты копируешь файл до установки? Т.е. ты сначала копируешь файл, а потом идет инсталляция, которая опять переписывает файл на оригинальный.
, да, действительно так и есть, тогда, как же сделать, чтобы файл копировался после установки?
Автор: doom2d
Дата сообщения: 31.07.2008 18:16
abasov.
Дело в том, что я не понимаю в чём проблема и поэтому не знаю что искать в том списке
сборника вопросов... про повтор InitializeWizard там нет ни слова...
Автор: AlexandP
Дата сообщения: 31.07.2008 19:43
Artem_Butenko
Спасибо за ответ. Я так понял, что сделав слепок реестра нужно будет как-то еще найти разницу и эти ключи вписАть в нужный раздел иносетап?
По-поводу вопроса о размере файла забил... разбил методом тыка по гигу с копейками и записал по несколько файлов на диск.. все получилось.. теперь буду из противности изучать эту программу... и справку.
Автор: abasov
Дата сообщения: 31.07.2008 20:33
doom2d
в факе ведь написано:
Просто вписывай значения из исходного procedure InitializeWizard уже без этой строчки:
[Code]
procedure InitializeWizard
begin
типа код вставки музыки
end;
begin
типа код вставки фонового рисунка
end;
Автор: Artem_Butenko
Дата сообщения: 31.07.2008 20:57
AlexandP сравнение изменений в системном реестре в RegShot осуществляется после снимка #2 (по кнопке "сравнить"). Рекомендую в данной программе включить мониторинг системного диска, на случай если Ваше приложение копирует файлы в папку Windows (например, шрифты, .dll и др.). Узнав "местоположение" .reg-ключей, сохраняем их (с помощью редактора реестра) в любой удобный каталог на HDD. Запускаем ISTool (благо для него есть русификатор), с помощью которого импортируем сохраненные ключи в формат Inno (Для этого в ISTool работаем с окном секции [Registry]: кликнув по свободному полю данного окна правой кнопкой мыши, выбираем в контекстом меню экспорт файлов реестра, находим соответствующие .reg-файлы на жестком диске). Теперь осталось правильно расставить кавычки длю ключей из секции [Registry]. Вот собственно и все (подробно, трудоемко и надежно). Успехов Вам в перепаковке приложений!
Автор: doom2d
Дата сообщения: 31.07.2008 21:35
В том то и дело что у меня код вставики музыки начинается ни с этой процедуры...
http://narod.ru/disk/1771675000/codes.rar.html - вот код вставки музыки и код вставки слайдшоу в отдельных
txt файлах - код который получился у меня - указан несколькими сообщениями выше...
Кто может посмотреть что я не так сделал... Я почитал что мне посоветовали... что то не помогает..
Автор: serg_aka_lain
Дата сообщения: 31.07.2008 23:14
doom2d

Цитата:
Кто может посмотреть что я не так сделал...

__ обработчик InitializeWizard повторяется два раза, нужно так [more]

[__Code]

type
HSTREAM = DWORD;

const
BACKGROUND = 6;
TIMER = 16;
BASS_SAMPLE_LOOP = 4;


function isxbb_AddImage(Image: PChar; Flags: Cardinal): Integer;
external 'isxbb_AddImage@files:isxbb.dll stdcall';

function isxbb_Init(hWnd: Integer): Integer;
external 'isxbb_Init@files:isxbb.dll stdcall';

function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): Integer;
external 'isxbb_StartTimer@files:isxbb.dll stdcall';

function isxbb_KillTimer(Flags: Cardinal): Integer;
external 'isxbb_KillTimer@files:isxbb.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 delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';


procedure InitializeWizard();
var
Name1: string;
    i: Integer;
begin
ExtractTemporaryFile('1.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\1.jpg',BACKGROUND);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('01-OVERSEER-Doomsday.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Name1 := ExpandConstant('{tmp}\01-OVERSEER-Doomsday.mp3');
i := BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
if i <> 0 then
begin
BASS_ChannelPlay(i, True);
end;
end;
end;


procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then
begin
ExtractTemporaryFile('2.jpg');
ExtractTemporaryFile('3.jpg');
ExtractTemporaryFile('4.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\2.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\3.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\4.jpg',BACKGROUND or TIMER);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(3,BACKGROUND)
end else
if CurStep=ssPostInstall then isxbb_KillTimer(BACKGROUND);
end;

[/more]


Автор: doom2d
Дата сообщения: 31.07.2008 23:57
Cпасибо конечно. Получился вот такой код -
Всё нормально компилится но при запуске готового инсталера проц загружается на 100% и
прога установки наглухо зависает.. В чём может быть проблема?
[more]
Код: ; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Doom Remake 3: Risen Version"
#define MyAppVerName "Doom Remake 3: Risen Version"
#define MyAppPublisher "Y-Dr. Now"
#define MyAppURL "http://www.site.ru"
#define MyAppExeName "MyProg.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{B7B472AC-0DB2-4C41-B51E-C8959EE82CCD}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
CreateAppDir=no
LicenseFile=C:\Risen3D\licen.txt
InfoBeforeFile=C:\Risen3D\Readit.txt
OutputDir=C:\Documents and Settings\User\Desktop
OutputBaseFilename=setup
SetupIconFile=C:\Documents and Settings\User\Desktop\doom.ico
Compression=lzma
SolidCompression=yes
WindowVisible=yes
WindowResizable=no
WindowShowCaption=no

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"

[Files]
Source: "C:\Risen3D\*"; DestDir: "{win}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: C:\isxbb.dll; DestDir: {tmp}; Flags: dontcopy
//files to slideshow

Source: C:\pack\0.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\1.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\2.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\3.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\4.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\5.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\6.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\7.jpg; DestDir: {tmp}; Flags: dontcopy
Source: C:\pack\8.jpg; DestDir: {tmp}; Flags: dontcopy
Source: "C:\BASS.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "C:\pack\d_e1m1.ogg"; DestDir: "{tmp}"; Flags: dontcopy

[Code]


type
HSTREAM = DWORD;

const
BACKGROUND = 6;
TIMER = 16;
BASS_SAMPLE_LOOP = 4;


function isxbb_AddImage(Image: PChar; Flags: Cardinal): Integer;
external 'isxbb_AddImage@files:isxbb.dll stdcall';

function isxbb_Init(hWnd: Integer): Integer;
external 'isxbb_Init@files:isxbb.dll stdcall';

function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): Integer;
external 'isxbb_StartTimer@files:isxbb.dll stdcall';

function isxbb_KillTimer(Flags: Cardinal): Integer;
external 'isxbb_KillTimer@files:isxbb.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 delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';


procedure InitializeWizard();
var
Name1: string;
i: Integer;
begin
ExtractTemporaryFile('0.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\0.jpg',BACKGROUND);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('d_e1m1.ogg');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Name1 := ExpandConstant('{tmp}\d_e1m1.ogg');
i := BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
if i <> 0 then
begin
BASS_ChannelPlay(i, True);
end;
end;
end;


procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then
begin
ExtractTemporaryFile('1.jpg');
ExtractTemporaryFile('2.jpg');
ExtractTemporaryFile('3.jpg');
ExtractTemporaryFile('4.jpg');
ExtractTemporaryFile('5.jpg');
ExtractTemporaryFile('6.jpg');
ExtractTemporaryFile('7.jpg');
ExtractTemporaryFile('8.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\1.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\2.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\3.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\4.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\5.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\6.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\7.jpg',BACKGROUND or TIMER);
isxbb_AddImage(ExpandConstant('{tmp}')+'\8.jpg',BACKGROUND or TIMER);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(3,BACKGROUND)
end else
if CurStep=ssPostInstall then isxbb_KillTimer(BACKGROUND);
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=False;
Confirm:=False;
if MsgBox('Хорошенько поDOOMайте прежде чем отменить установку! Вы действительно не любите Doom?', mbError, MB_YESNO) = idYes
then
Cancel:=true;
end;

[Icons]
Name: "{commonprograms}\Doom Remake3"; Filename: "{app}\Risen3D\R3DLaunch\r3dlauncher.exe"; WorkingDir: {app}\Risen3D\R3DLaunch
Автор: KurtWagner
Дата сообщения: 01.08.2008 00:39
Помогите плиз!!! У меня 4-ри вопроса как при деинстализации высвечивать список удаляемых файлов 1? = http://kurtwagner.wen.ru/Kak.jpg 2?= как поменять цвет сдесь http://kurtwagner.wen.ru/Kak2.jpg и последний вопрос 3?= http://kurtwagner.wen.ru/Kak3.jpg как заставить не высвечивать ощибку сходства а просто пропустить!!! ... + еще 1-ин как сделать чтоб было как и в Inno Setup Quickstartpack 5.2.2 пример...
вообщем как сделать такую загрузку с иНЕТа... заранее спасибо!!! http://kurtwagner.wen.ru/Kak4.jpg
ЗАРАНЕЕ СПАСИБО
Автор: Victor_Dobrov
Дата сообщения: 01.08.2008 01:45
doom2d
Цитата:
при запуске готового инсталера проц загружается на 100% и
прога установки наглухо зависает.. В чём может быть проблема?

Не зависает, а распаковывает картинки и музыку, которые указаны после основных файлов. Чтобы показать слайдшоу, инсталлятор при запуске вынужден просмотреть почти весь архив. Разместите эти файлы первыми или установите флаг solidbreak:

[Files]
Source: C:\Risen3D\*; DestDir: {win}; Flags: ignoreversion recursesubdirs createallsubdirs
; здесь НЕОБХОДИМО завершить предыдущий поток сжатия и начать навый
Source: compiler:isxbb.dll; DestDir: {tmp}; Flags: dontcopy solidbreak
; files to slideshow:
Source: pack\0.jpg; DestDir: {tmp}; Flags: dontcopy
......................

abasov
Цитата:
Есть код Delphi, помогите перекроить в iss

В этом я не спец, могу только заметить, что Delphi намного сложнее Паскаля Inno, поэтому перенос кода почти невозможен.

abasov и doom2d - прочитайте шапку и переделайте ваши сообщения - заключите код скрипта в тэг more
Автор: SotM
Дата сообщения: 01.08.2008 07:31
abasov & doom2d
В шапке написано про тег [ more ] и почему же не используем его?
Зачем всю страницу заполнять текстами программ?!

KurtWagner
Не все твои файлы доступны в инете, проверь их.
Автор: doom2d
Дата сообщения: 01.08.2008 08:56
Всем спасибо кто помог.
Но вот ещё вопрос... Почему у меня по умолчанию в папку c:\windows распаковывается...
Мне надо чтобы в c:\
Автор: ExpeditorR
Дата сообщения: 01.08.2008 09:22
doom2d

Цитата:
Всем спасибо кто помог.
Но вот ещё вопрос... Почему у меня по умолчанию в папку c:\windows распаковывается...
Мне надо чтобы в c:\


потому что в строке приведёной ниже у тебя написано {win}, замени на {sd} и всё установится в корень того диска, где у тебя установлена винда, тоесть если windows установлена на диске С, то и распакуется у тебя всё на диск C.

Цитата:
Source: "C:\Risen3D\*"; DestDir: "{win}"; Flags: ignoreversion recursesubdirs createallsubdirs
Автор: nOobCrafter
Дата сообщения: 01.08.2008 10:47
Всем привет из солнечного Крыма ~
Хотел бы вернуться к моему вопросу, а именно, есть задача (таск) надо что бы когда галочки на ней небыло (то есть она была бы невыбрана) выдавалась табличка ( типа "MsgBox('Желательно сделать резервную копию!' ,mbInformation, mb_Ok);" ), мол так и так. Я все это дело закинул в функцию "function ShouldSkipPage" в [more=таком виде]function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page2.ID) and Not IsTaskSelected('bak') then
Result:= True;
Begin
MsgBox('Желательно сделать резервную копию!' ,mbInformation, mb_Ok);
End;
End;[/more], но тогда у меня получается трабла, изза 2х действий табличка выскакивает 2 раза, хз как это отметить, привязка к страницам надо как показывает практика и в тоже время без таска она не имееет смысла((
Если поменять как ранее советовал тов. Genri то она вообще вылазит в каждом окошке..(( Или может я вообще нетам копаю и надо в другой функции все реализовывать?... Надеюсь я ясно изложился, ууфф..
Автор: Genri
Дата сообщения: 01.08.2008 11:04
Diawer

Цитата:
как же сделать, чтобы файл копировался после установки?
-- хм, думаю единственное решение, это копировать файл после установки Варианты могут быть самые разные. Например, замени if CurPage = Page.ID then... на if CurPage = wpFinished then...

abasov

Цитата:
сделать проверку доступности сети
-- а что понимается под "доступностью сети"? Наличие сетевой карты? Подключение сетевого кабеля? Доступность конкретного хоста?
Как вариант, могу предложить такое [more=решение]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[CustomMessages]
DEC_1 = Local system uses a modem to connect to the Internet.
DEC_2 = Local system uses a LAN to connect to the Internet.
DEC_4 = Local system uses a proxy server to connect to the Internet.
DEC_16 = Local system has RAS installed.
DEC_32 = Local system is in offline mode.
DEC_64 = Local system has a valid connection to the Internet,
DEC_64P = but it might or might not be currently connected.

[_Code]
function InternetGetConnectedState(var lpdwFlags: DWORD; dwReserved: DWORD): boolean;
external 'InternetGetConnectedState@wininet.dll stdcall';

const
INTERNET_CONNECTION_MODEM = $01;
INTERNET_CONNECTION_LAN = $02;
INTERNET_CONNECTION_PROXY = $04;
INTERNET_CONNECTION_MODEM_BUSY = $08;
INTERNET_CONNECTION_OFFLINE = $20;
INTERNET_CONNECTION_CONFIGURED = $40;

var
TestSuccess: boolean;
ConnectionState: DWORD;
ConnectDescription: string;

procedure InitializeWizard();
begin
TestSuccess:= InternetGetConnectedState(ConnectionState, 0);

If TestSuccess then
ConnectDescription:= 'You have connection to internet' + #13 +
'and your connection has following parameters:'+ #13
else
ConnectDescription:= 'You havn''t connection to internet.'+ #13;

If ConnectionState and INTERNET_CONNECTION_MODEM = INTERNET_CONNECTION_MODEM
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_1}');

If ConnectionState and INTERNET_CONNECTION_LAN = INTERNET_CONNECTION_LAN
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_2}');

If ConnectionState and INTERNET_CONNECTION_PROXY = INTERNET_CONNECTION_PROXY
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_4}');

If ConnectionState and INTERNET_CONNECTION_MODEM_BUSY = INTERNET_CONNECTION_MODEM_BUSY
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_16}');

If ConnectionState and INTERNET_CONNECTION_OFFLINE = INTERNET_CONNECTION_OFFLINE
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_32}');

If ConnectionState and INTERNET_CONNECTION_CONFIGURED = INTERNET_CONNECTION_CONFIGURED
then ConnectDescription:= ConnectDescription + #13 + ExpandConstant('{cm:DEC_64}')
+ #13 + ExpandConstant('{cm:DEC_64P}');
MsgBox(ConnectDescription, mbInformation, MB_OK);
end; [/more].

Добавлено:
nOobCrafter -- я в очередной раз не могу понять, что подразумевается под
Цитата:
изза 2х действий табличка выскакивает 2 раза

Табличка - это я так понимаю окно сообщения. А о каких двух действиях идет речь?



Добавлено:
nOobCrafter -- еще раз посмотрел твою функцию. Если оставить как у тебя, то если не выбран таск, страница Page2 не будет отображена, а сообщение 'Желательно сделать резервную копию!' будет показано столько раз, сколько всего есть страниц.
Если поменять местами строки:
Result:= True;
Begin
...то если не выбран таск, страница Page2 не будет отображена и будет показано сообщение 'Желательно сделать резервную копию!' (один раз в момент пропуска страницы)
Если перестановка строк не приводит к нужному результату - давай весь код.

Исправление: Проверка показала, что в инно действительно есть такая особенность - функция ShouldSkipPage вызывается по два раза на страницу. При штатной обработке это на результат не влияет. Но дополнительные действия (например вывод сообщения), подпадут под условие два раза. Так что в данном случае я был не прав.
Автор: Artem_Butenko
Дата сообщения: 01.08.2008 12:09
Здравствуйте почитатели Inno Setup. Хочу извиниться перед Виктором, просто хотелось поработать с препроцессором на живых примерах. На форуме предлагались скрипты озвучивание кликов по кнопке (.wav), однако процедуры и функции наложения озвучки на кнопку "Обзор", на странице выбора директории установки и программной группы, не срабатывают. Кто знает как это исправить?

Добавлено:
Еще в тему. А для новых страниц структура скрипта озвучки клика будет эталонной?
Автор: ExpeditorR
Дата сообщения: 01.08.2008 12:48
Для тех кто интересовался настоящим слайд-шоу по процентам установки с jpeg картинками, предлагаю следующий [more=скрипт:]
[Setup]
SourceDir=.
OutputDir=Setup
AppName=slide-show
AppVerName=slide-show
AppVersion=1.0
DefaultDirName={pf}\slide-show
DefaultGroupName=slide-show
OutputBaseFilename=setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=zip

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"

[Icons]
Name: "{group}\{cm:UninstallProgram,slide-show}"; Filename: "{uninstallexe}"

[Files]
Source: "C:\AnyFiles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: isjpgtobmp.dll; DestDir: {tmp}; Flags: dontcopy
Source: BackImage.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 1.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 2.jpg; DestDir: {tmp}; Flags: dontcopy
Source: 3.jpg; DestDir: {tmp}; Flags: dontcopy

[Code]
type
TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
BackImage: TBitmapImage;
TimerID: LongWord;
CurrentPicture,res:integer;
PicList: TStringlist;
path,Pics: string;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall';
procedure convertjpgtobmp(p: String); external 'convertjpgtobmp@files:isjpgtobmp.dll stdcall';


procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
Pic: integer;
d:double;
begin
d:=WizardForm.ProgressGauge.Max / ( piclist.Count );
Pic:= round( WizardForm.ProgressGauge.Position / d);
if( Pic <> CurrentPicture ) then
begin
CurrentPicture := Pic;
try
BackImage.Bitmap.LoadFromFile(piclist.strings[CurrentPicture - 1])
except
end;
end;
end;

procedure InitializeWizard();
var
pfunc: LongWord;
begin
pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 200, pfunc)
PicList:=tstringlist.Create;
WizardForm.Position:=poScreenCenter
WizardForm.CancelButton.BringToFront;
MainForm.BORDERSTYLE:=bsNone
MainForm.Left:=0
MainForm.Top:=0
MainForm.Width:=GetSystemMetrics(0)
MainForm.Height:=GetSystemMetrics(1)
ExtractTemporaryFile('BackImage.jpg')
pics:=ExpandConstant('{tmp}')+'\BackImage.jpg ';
convertjpgtobmp(pics);
BackImage:=TBitmapImage.Create(MainForm)
BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\BackImage.bmp ')
BackImage.Align:=alClient
BackImage.Parent:=MainForm
BackImage.Stretch:=True
MainForm.Visible:=True
path:=ExpandConstant('{tmp}');
ExtractTemporaryFile('1.jpg')
ExtractTemporaryFile('2.jpg')
ExtractTemporaryFile('3.jpg')
piclist.add(path + '\1.bmp');
piclist.add(path + '\2.bmp');
piclist.add(path + '\3.bmp');
pics:=path+'\1.jpg';
convertjpgtobmp(pics);
pics:=path+'\2.jpg';
convertjpgtobmp(pics);
pics:=path+'\3.jpg';
convertjpgtobmp(pics);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpInstalling then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-25);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-25);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end

if CurPageID=wpFinished then
begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\BackImage.bmp')
end
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;
[/more]. В нём задействовано 2 dll, innocallback.dll и isjpgtobmp.dll. Собственно isjpgtobmp.dll я написал специально для этого слайд-шоу, она конвертирует jpeg в bmp, в качестве параметра ей нужно передавать путь к jpeg файлу, и в той же папке она создаст bmp файл. В отличие от dll написаных с GDI+ моя dll работает даже в win98. Все dll'ки можно скачать:
За предоставленную полезную информацию для этого слайд-шоу - говорим спасибо Chanka
Автор: Artem_Butenko
Дата сообщения: 01.08.2008 13:08
Ребята, всем всем всем (особенно: ExpeditorR и Chanka!!!), кто работал над созданием слайд-шоу из .jpeg по процентам прогресс-бара, огромное человеческое спасибо. Пока еще не пробывал в действии, но верю, что все работает как часы.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


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