Войти

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


Страниц : 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

habib2302
02-04-2013, 22:05
Gnom_aka_Lexander, я так и думал!

insombia
02-04-2013, 22:20
Johny777 а как в твоем примере растянуть картинку на весь инсталл? как фоновой так и маленькой

habib2302
02-04-2013, 23:31
люди.подскажите как убрать combo box в страници компонентов?
http://img194.imageshack.us/img194/4619/thumb3mg.png (http://img197.imageshack.us/img197/8960/snagit00020204201322222.png)

vint56
03-04-2013, 00:36
habib2302 WizardForm.TypesCombo.hide;

habib2302
03-04-2013, 00:50
помогите мне объеденить этот скрипт с моим

#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[........Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;


function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;


procedure InitializeWizard;
var
bPicHandle, bPicHandle2, lPicHandle: THandle;
begin
with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeSetup();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
lPicHandle: THandle;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;

saurn
03-04-2013, 01:56
habib2302

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"

#define AuthRep "Xabib"

#include "WinTB.iss"
#include "botva2.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile={tmp}\ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.p ng

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

[Components]
Name: AIDA64; Description: AIDA64; Types: full;
Name: AIDA64\AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA64\AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора
;Source: logo.png; Flags: dontcopy;
;Source: botva2.dll; Flags: dontcopy;
;Source: b2p.dll; Flags: dontcopy;
;Source: botva2.dll; DestDir:{app}
;Source: b2p.dll; DestDir:{app}
;Source: logo.png; DestDir: {app};
Source: WinTB.dll; Flags: dontcopy;
Source: {tmp}\ico.ico; DestDir: {app}; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Dirs]
Name: {app}\{#AIDA641}; Components: AIDA64\AIDA641;
Name: {app}\{#AIDA642}; Components: AIDA64\AIDA642;

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA64\AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA64\AIDA642;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe};
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA64\AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA64\AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[UninstallDelete]
Type: files; Name: {app}

[Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;

var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;
ResultCode: Integer;
lPLogo, bPicHandle, bPicHandle2, lPicHandle: THandle;
BtnImage: TBitmapImage;

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;

procedure TDVOnChange(Sender: TObject);
begin
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#MyAppName}';
end;

procedure TFVOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#MyAppName}';
end;

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
Result:=True;
end;

procedure InitializeWizard;
begin
with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgApplyChanges(WizardForm.Handle);
end;

SetTaskBarProgressValue(0, 60);
SetTaskBarProgressState(0, TBPF_ERROR);
TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);

TDV:= TFolderTreeView.Create(WizardForm);
TDV.Top:= WizardForm.DirEdit.Top+28;
TDV.Width:= 417;
TDV.Height:= 100;
TDV.OnChange:= @TDVOnChange;
TDV.Parent:= WizardForm.SelectDirPage;

TFV:= TStartMenuFolderTreeView.Create(nil);
TFV.Top:= WizardForm.GroupEdit.Top+28;
TFV.Width:= 417;
TFV.Height:= 100;
TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{us erstartup}'),ExpandConstant('{commonstartup}'));
TFV.OnChange:= @TFVOnChange;
TFV.Parent:= WizardForm.SelectProgramGroupPage;

with TLabel.Create(WizardForm) do
begin
Parent:=WizardForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
end;
end;
end;

procedure DeinitializeSetup();
begin
gdipShutdown;
TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgApplyChanges(UninstallProgressForm.Handle);
end;

with TLabel.Create(nil) do
begin
Parent:=UninstallProgressForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38));
end;
end;
end;

procedure DeinitializeUninstall();
begin
gdipShutdown;
end;

vint56
03-04-2013, 02:19
habib2302
#define MyAppName "AIDA64"
#define MyAppVersion "2.85.2400"
#define MyAppPublisher "Copyright (c) 1995-2013 FinalWire Ltd."
#define MyAppURL "http://www.aida64.com/"
#define AIDA641 "AIDA64 Extreme Edition"
#define AIDA642 "AIDA64 Business Edition"
#define AIDA64EXE1 "aida64.exe"
#define AIDA64EXE2 "aida64.exe"

#define AuthRep "Xabib"
#include "botva2.iss"
[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile={tmp}\ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Авторские права.
VersionInfoCopyright={#AuthRep}
;Производитель.
AppPublisher={#AuthRep}
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LgPic:Logo.png|LiPic:LiPic.png|aPic:aPic.png

[Files]
Source: WinTB.dll; Flags: dontcopy;
Source: {tmp}\ico.ico; DestDir: {app}; Flags: ignoreversion
;Source: botva2.dll; Flags: dontcopy
;Source: bPic.png; Flags: dontcopy

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

[Components]
Name: AIDA64; Description: AIDA64; Types: full;
Name: AIDA64\AIDA641; Description: {#AIDA641}; Flags: exclusive;
Name: AIDA64\AIDA642; Description: {#AIDA642}; Flags: exclusive;

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач; OnlyBelowVersion: 0,6.1;


[Dirs]
Name: {app}\{#AIDA641}; Components: AIDA64\AIDA641;
Name: {app}\{#AIDA642}; Components: AIDA64\AIDA642;

[Icons]
Name: {group}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Components: AIDA64\AIDA641;
Name: {group}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Components: AIDA64\AIDA642;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe};
Name: {group}\Сайт {#MyAppName}; Filename: {#MyAppURL}
Name: {commondesktop}\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\desktop; Components: AIDA64\AIDA641;
Name: {commondesktop}\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\desktop; Components: AIDA64\AIDA642;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA641}; Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA641;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AIDA642}; Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Tasks: icons\quicklaunchicon; Components: AIDA64\AIDA642;

[Run]
Filename: {app}\{#AIDA641}\{#AIDA64EXE1}; Description: "{cm:LaunchProgram,{#StringChange(AIDA641, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA641;
Filename: {app}\{#AIDA642}\{#AIDA64EXE2}; Description: "{cm:LaunchProgram,{#StringChange(AIDA642, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Unchecked; Components: AIDA64\AIDA642;

[Messages]
BeveledLabel=RePack by {#AuthRep}

[UninstallDelete]
Type: files; Name: {app}


[Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;


var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

procedure TDVOnChange(Sender: TObject);
begin
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#MyAppName}';
end;

procedure TFVOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#MyAppName}';
end;

#include "WinTB.iss"

function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;


function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\WinTB.dll')) then ExtractTemporaryFile('WinTB.dll');
Result:=True;
end;


procedure InitializeWizard;
var
bPicHandle, bPicHandle2, lPicHandle,LGPicHandle: THandle;
begin
with WizardForm do
begin
WizardForm.TypesCombo.hide;
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;
ExtractTemporaryFile('WinTB.dll');
SetTaskBarProgressValue(0, 60);
SetTaskBarProgressState(0, TBPF_ERROR);
TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
TDV:= TFolderTreeView.Create(WizardForm);
TDV.Top:= WizardForm.DirEdit.Top+28;
TDV.Width:= 417;
TDV.Height:= 100;
TDV.OnChange:= @TDVOnChange;
TDV.Parent:= WizardForm.SelectDirPage;
TFV:= TStartMenuFolderTreeView.Create(WizardForm);
TFV.Top:= WizardForm.GroupEdit.Top+28;
TFV.Width:= 417;
TFV.Height:= 100;
TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{us erstartup}'),ExpandConstant('{commonstartup}'));
TFV.OnChange:= @TFVOnChange;
TFV.Parent:= WizardForm.SelectProgramGroupPage;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LGPIC', 'Logo.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

lGPicHandle := ImgLoad(WizardForm.handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgSetVisibility(LGPicHandle, True);
ImgApplyChanges(Wizardform.Handle);

bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;

procedure DeinitializeSetup;
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
TaskBarDestroy;
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
lPicHandle,lGPicHandle: THandle;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') and GetFromRes('_IS_LGPIC', 'Logo.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

lGPicHandle := ImgLoad(UninstallProgressForm.handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(126), ScaleY(38), True, True);
ImgSetVisibility(LGPicHandle, True);
ImgApplyChanges(UninstallProgressForm.Handle);
end;
end;
end;

procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

saurn
03-04-2013, 02:38
habib2302, только что скомпилировал - ошибок нет. Ресурсы botva2.dll, b2p.dll, logo.png, bPic.png, LiPic.png, aPic.png должны находится рядом со скриптом.

Johny777
03-04-2013, 02:42
Gnom_aka_Lexander, наоборот. несколько мелких функций гораздо оптимальнее одного здоровенного уродливого монстра. единственное, для дополнительной оптимизации есь смысл передавать TStrings со списком ресурсов , дабы не создавать для каждого ресурса отдельный объект TResourceStream. Создали и в цикле по списку выгружаем на диск, с очисткой после выгрузки. Это точно будет быстрее, чем столько-же раз создать и разрушить объект. »

В натуре. Цикл действительно ускорил скорость запуска, что видно на глаз по появлению кнопки в панели задач - теперь без тормозка.
в цикле создаём массив of TResourceStream, и сразу же извлекаем файл и разрушаем TResourceStream-ы и входной стринглист
Короче зацени function ExtractResource(var ResourceList: TStringList): Boolean; чуть ниже под спойлером! :)
habib2302, vint56, saurn, вот обновлённый пример, он совместим с файлами из архива в моём предыдущем посте:

#include "botva2.iss"

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;


function ExtractResource(var ResourceList: TStringList): Boolean;
var
ResStreams: array of TResourceStream;
ResName, ResFile: String;
i: Integer;
begin
if ResourceList = nil then Exit;
Result := ResourceList.Count > 0;
SetArrayLength(ResStreams, ResourceList.Count);
try
for i := 0 to ResourceList.Count-1 do
try
ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
finally
ResStreams[i].Free;
end;
finally
ResourceList.Free;
end;
end;


procedure InitializeWizard;
var
PicHandle: THandle;
ResList: TStringList;
begin
ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll'); // 'Имя ресурса, имя файла'
ResList.Add('_IS_BPIC, bPic.png');
ResList.Add('_IS_LIPIC, LiPic.png');
ResList.Add('_IS_APIC, aPic.png');

with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;

if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;


procedure DeinitializeSetup;
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

/////////////////////////////////////////////////////////////////////

procedure InitializeUninstallProgressForm();
var
PicHandle: THandle;
ResList: TStringList;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll');
ResList.Add('_IS_LIPIC, LIPic.png');

if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;


procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;



=======================================================================

insombia,
Johny777 а как в твоем примере растянуть картинку на весь инсталл? как фоновой так и маленькой »
хочешь удивлю?
перед тем как сделать тот пример открыл пример ботвы ...\Inno Setup 5\Modules\South\botva2_example\image.iss и посмотрел как создать картинку. До этого ботву не использовал и не знал
потом открыл модуль где автор любезно под каждым прототипом функции по русски описал все входные аргументы и сделал пример!
цитирую описание к функции ImgLoad(...):

function ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
//загружает изображение в память, сохраняет переданные параметры
//Wnd - хэндл окна, в котором будет выведено изображение
//FileName - файл изображения
//Left,Top - координаты верхнего левого угла вывода изображения (в координатах клиентской области Wnd)
//Width,Height - ширина, высота изображения
// если Stretch=True, то изображение будет растянуто/сжато в прямоугольной области
// Rect.Left:=Left;
// Rect.Top:=Top;
// Rect.Right:=Left+Width;
// Rect.Bottom:=Top+Height;
// если Stretch=False, то параметры Width,Height игнорируются и вычисляются самой ImgLoad, т.е. можно передать 0
//Stretch - масштабировать изображение или нет
//IsBkg - если IsBkg=True, изображение будет выведено на фоне формы,
// поверх него будут отрисованы графические объекты (TLabel, TBitmapImage и т.д.),
// затем поверх всего будут выведены изображения с флагом IsBkg=False
//возвращаемое значение - указатель на структуру, хранящей изображение и его парметры, приведенный к типу Longint
//изображения будут выведены в той последовательности, в которой вызывается ImgLoad


Напрашивается вопрос: Ты хоть сам пробовал немного разобраться прежде чем спрашивать?
короче настраивай последние в вышеупомянутой функции
...Width, Height :integer; Stretch, IsBkg :boolean) :Longint;
...ширина, высота - целочисленные значения (пиши при необходимости через ScaleY,X() ), растянуть, на фоне - булев значения): Longint;

===========================================================================

UPD:
saurn,
Небольшой вопрос по вашему примеру для отображения процентов http://forum.oszone.net/post-2123218-47.html , как его корректно реализовать в деинсталяторе? »
вот так:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code ]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
WM_USER = $0400;
// CCM_FIRST = $2000;
// CCM_SETBKCOLOR = CCM_FIRST + 1;
//
// PBS_SMOOTH = 01;
// PBS_VERTICAL = 04;
// PBM_SETRANGE = WM_USER+1;
PBM_SETPOS = WM_USER+2;
// PBM_DELTAPOS = WM_USER+3;
// PBM_SETSTEP = WM_USER+4;
// PBM_STEPIT = WM_USER+5;
// PBM_SETRANGE32 = WM_USER+6; // lParam = high, wParam = low
PBM_GETRANGE = WM_USER+7; // lParam = PPBRange or Nil
// // wParam = False: Result = high
// // wParam = True: Result = low
PBM_GETPOS = WM_USER+8;
// PBM_SETBARCOLOR = WM_USER+9; // lParam = bar color
// PBM_SETBKCOLOR = CCM_SETBKCOLOR; // lParam = bkColor
//
// { For Windows >= XP }
// PBS_MARQUEE = $08;
// PBM_SETMARQUEE = WM_USER+10;
//
// { For Windows >= Vista }
// PBS_SMOOTHREVERSE = $10;
//
// { For Windows >= Vista }
// PBM_GETSTEP = WM_USER+13;
// PBM_GETBKCOLOR = WM_USER+14;
// PBM_GETBARCOLOR = WM_USER+15;
// PBM_SETSTATE = WM_USER+16; { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
// PBM_GETSTATE = WM_USER+17;
//
// { For Windows >= Vista }
// PBST_NORMAL = $0001;
// PBST_ERROR = $0002;
// PBST_PAUSED = $0003;

GWL_WNDPROC = -4;


type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
OldProgressBarProc, hInstallStatusLabel, hInstallProgressBar: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
UndefPosition, UndefMax: Longint;
begin
if Msg = PBM_SETPOS then
begin
UndefPosition := SendMessage(hInstallProgressBar, PBM_GETPOS, 0, 0);
UndefMax := SendMessage(hInstallProgressBar, PBM_GETRANGE, 0, 0);
SetWindowText( hInstallStatusLabel, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (UndefPosition*100)/UndefMax)]) );
end;

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
hInstallProgressBar := WizardForm.ProgressGauge.Handle;
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
hInstallStatusLabel := WizardForm.StatusLabel.Handle;
end;

procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

//////////////////////////////////////////////////////////////////////

var
hUnistallProgress, hUninstallStatusLabel: Longint;

function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
UndefPosition, UndefMax: Longint;
begin
if Msg = PBM_SETPOS then
begin
UndefPosition := SendMessage(hUnistallProgress, PBM_GETPOS, 0, 0);
UndefMax := SendMessage(hUnistallProgress, PBM_GETRANGE, 0, 0);
SetWindowText( hUninstallStatusLabel, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (UndefPosition*100)/UndefMax)]) );
end;

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure UninstallFormOnHide(Sender: TObject);
begin
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

procedure InitializeUninstallProgressForm();
begin
hUnistallProgress := UninstallProgressForm.ProgressBar.Handle;
hUninstallStatusLabel := UninstallProgressForm.StatusLabel.Handle;
OldProgressBarProc := SetWindowLong(hUnistallProgress, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;


+ улучшил код:
1. Проценты отображаются в лучшем месте, чем в заголовке формы
2. Теперь никакого прямого обращения к контролам через оконную процедуру - всё обращение теперь на чистом WinApi (это гарантированно избавит от возможных ошибок) через адреса
PS: И обращайся на Ты, а то мне как-то не по себе! :)

UPD: Обновлённый пример благодаря правке El Sanchez-а http://forum.oszone.net/post-2125286-79.html :)
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code ]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
WM_USER = $0400;
PBM_SETPOS = WM_USER+2;
GWL_WNDPROC = -4;


type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

/////////////////////////////// Uninstall //////////////////////////////////


function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure UninstallFormOnHide(Sender: TObject);
begin
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

procedure InitializeUninstallProgressForm();
begin
OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;

habib2302
03-04-2013, 02:54
saurn, sorry!!!!все работает

Tco 03
03-04-2013, 11:11
Короче зацени function ExtractResource(var ResourceList: TStringList): Boolean; »
Заценил! :coffee:
После удаления программы в папке TEMP остаётся мусор, ровно такого размера, что и unins000.exe

Gnom_aka_Lexander
03-04-2013, 15:10
Tco 03, Ну, джонни еще многое нужно узнать об элементарных правилах кодинга. Хотя - убирать за собой - можно назвать одним из основополагающих. Но при этом одним из самых трудновыполнимых. так что не суди строго, возьми да сам сделай зачистку темпа при выходе, это несложно.

Tco 03
03-04-2013, 16:09
Gnom_aka_Lexander
Да я вообще ничего плохово сказать не хотел, так сказать расказал о своих наблюдениях. Ну и от таких наблюдений, я думаю, Джонни доведёт всё до совершенства.

Johny777
03-04-2013, 17:40
Tco 03, Спасибо за внимательность! :) Хорошо, что есть люди которые помогают сделать лучше! Назвал имя батника удаления в твою честь из благодарности!

to All
теперь собственно о файле:
1. Он зовётся именем процесса деинсталятора и деинсталятор держит его пока процесс не убьётся, а значит удалить файл через код напрямую нельзя ни на каком этапе или процедуре связанных с деинсталятором
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно
например попробуйте установить и удалить этот скрипт и в темпе останется похожий файл:

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup

Но путём изврата удалось реализовать метод его удаления:
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса
(функция function GetCurrentProcessId(): DWORD; всё упрощает)
мы получаем путь к тому самому файлу... и удаляем его малость модифицированным мной примером Genri (самоудаление) (исходник http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1280#3 )
вот исправленный пример с ботвой:

#include "botva2.iss"

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;



function ExtractResource(var ResourceList: TStringList): Boolean;
var
ResStreams: array of TResourceStream;
ResName, ResFile: String;
i: Integer;
begin
if ResourceList = nil then Exit;
Result := ResourceList.Count > 0;
SetArrayLength(ResStreams, ResourceList.Count);
try
for i := 0 to ResourceList.Count-1 do
try
ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
finally
ResStreams[i].Free;
end;
finally
ResourceList.Free;
end;
end;


function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
szExeFile: array [0..MAX_PATH-1] of Char;
hProc: THandle;
begin
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
begin
Result := '';
while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
Result := RemoveBackSlash(Result);
end;
end;



procedure InitializeWizard;
var
PicHandle: THandle;
ResList: TStringList;
begin
ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll'); // 'Имя ресурса, имя файла'
ResList.Add('_IS_BPIC, bPic.png');
ResList.Add('_IS_LIPIC, LiPic.png');
ResList.Add('_IS_APIC, aPic.png');



with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;

if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(WelcomePage.Handle);

PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(FinishedPage.Handle);

PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;


procedure DeinitializeSetup;
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

/////////////////////////////////////////////////////////////////////


procedure SelfDelete(const FileName: String);
var
BatName: String;
ResultCode: Integer;
begin
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
if SaveStringToFile(BatName,
'@echo off' + #10#13 +
':LOOP' + #10#13 +
'del ' + '"' + FileName + '"' + #10#13 +
'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
'del ' + '"' + BatName + '"',
False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;



procedure InitializeUninstallProgressForm();
var
PicHandle: THandle;
ResList: TStringList;
begin
MsgBox('путь к файлу от которого исходит процесс нашей программы:' +#13#10 + GetMyProcName(), mbInformation, MB_OK);

with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;

ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll');
ResList.Add('_IS_LIPIC, LIPic.png');

if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;


procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
SelfDelete(GetMyProcName);
end;


вот просто пример удаления этого файла:

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup

[ Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;

function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

procedure SelfDelete(const FileName: String);
var
BatName: String;
ResultCode: Integer;
begin
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
if SaveStringToFile(BatName,
'@echo off' + #10#13 +
':LOOP' + #10#13 +
'del ' + '"' + FileName + '"' + #10#13 +
'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
'del ' + '"' + BatName + '"',
False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;


function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
szExeFile: array [0..MAX_PATH-1] of Char;
hProc: THandle;
begin
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
begin
Result := '';
while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
Result := RemoveBackSlash(Result);
end;
end;

procedure DeinitializeUninstall();
begin
SelfDelete(GetMyProcName);
end;


Хотя - убирать за собой - можно назвать одним из основополагающих »
Походу в Restools не принято, ведь файл оставляет инно по умолчанию без участия автора инсталла! :)

PS: просьба потестировать на всякий случай!

Gnom_aka_Lexander
03-04-2013, 17:57
Походу в Restools не принято »
Но они и не обновляли очень давно. Я лично пользуюсь своей сборкой, на базе инно именно 5.5.1 и соответствующей версией расширенной. то-есть апдейт Inno Setup Compiler(build 121216)ни в коем случае не использую, поскольку он уже на базе 5.5.2, скорей всего не страшно, но я люблю ,чтоб все соответствовало, ибо только так можно добиться безглючности и стабильности. так вот. в простейшем варианте папка темп у меня отлично удаляется сама собой, хотя подчистка временной папки на выходе у меня всегда на всякий случай есть.

Johny777
03-04-2013, 18:03
Gnom_aka_Lexander, Gnom_aka_Lexander, пока никакой инно не пользуюсь, она стоит только чтоб на форуме помогать :) тк переношу/реализую проект инсталла халфы на дельфи(2010 пока что) по некоторым причинам не в пользу инно, но проект всё ещё в зародыше.
хотя подчистка временной папки на выходе у меня всегда на всякий случай есть. »
можешь пожалуйста показать мне исходник как чистишь темп после инно? (Такой пример я б себе сохранил на всякий случай)

И кстати кто хорошо знает Вин Апи или/и реестр? Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки

Gnom_aka_Lexander
03-04-2013, 18:38
Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки »
както так:
var
res ; integer;
begin
Exec('cmd', '/c at 12:00 C:\MyProga.exe',ExpandConstant('{win}'), SW_Hide, ewNoWait, res);
Только вот журнал заданий может быть отключен или даже выпилен пользователем, а чаще г-сборщиком "за ненадобностью"

Tco 03
03-04-2013, 19:13
просьба потестировать на всякий случай! »
Теперь всё чисто! Что создалось, то и удалилось.
Чище только так: cd /d "%temp%" && rd /s /q "." :teeth:
Только я бы вписал вместо: LOOP - trydel и соответственно: goto trydel ну это так, каждый хочет поумничить :grin:

El Sanchez
03-04-2013, 22:24
2. Теперь никакого прямого обращения к контролам через оконную процедуру - всё обращение теперь на чистом WinApi »
Johny777, что так? Ты ж не из другого потока к контролам обращаешься.
это гарантированно избавит от возможных ошибок »
Johny777, от каких?
if Msg = PBM_SETPOS then
begin
UndefPosition := SendMessage(hInstallProgressBar, PBM_GETPOS, 0, 0); »
Johny777, первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
(UndefPosition*100)/UndefMax »
Johny777, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно »
Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке.

Johny777
04-04-2013, 03:23
El Sanchez,
от каких? Ты ж не из другого потока к контролам обращаешься.»
В том то и дело, думал что это поток. Вспомнил маты винды на указатели, переполнение стека и прочее когда к контролам обращался из каллбэка твоей имплементации 7-zip в инно
первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.»
Вернулся назад к обращению к контролам. Код стал проще и короче. Думаю это финальная версия. (отредактировал предыдущий пост http://forum.oszone.net/post-2124681-69.html )
Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке. »
не знал :(. Вот винда удивится, когда этот файл не найдёт...
===========
Спасибо тебе большое за исправления. Теперь я знаю и умею больше!
PS: просьба и дальше делать: El_Sanchez.Сообщение.Текст := Ошибка(неверный_код^) + #13#10 + Исправление; , когда у меня будут ошибки или недоработки! ;)




© OSzone.net 2001-2012