Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Johny777, Точно, сразу не сообразил так сделать, удалил taskkill.exe. Проверил, действительно без taskkill.exe всё работает и убивает процессы без исполняемого файла, а значит библиотека не обращается к taskkill.exe и не передаёт какие либо команды для завершения процесса, что имеет большой плюс. Нет двойного обращения.
El Sanchez, Спасибо! Этот ответ вполне устраивает. Т.е на сколько я понял istask.dll обращается напрямую к kernel32.dll ExitProcess.
Если библиотека используется примерно так "istask.dll - > kernel32.dll, а не так istask.dll - > kernel32.dll - > taskkill.exe, то это уже совсем другое дело.
Ещё раз Спасибо!
А что насчёт http://forum.oszone.net/post-1946494-388.html этого вопроса, есть какие нибудь варианты?
Johny777
05-07-2012, 17:31
Ваня
код:
#define MyAppName "test"
[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:BloodRain_U.bmp
[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}
[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function InitializeSetup:boolean;
begin
ExtractTemporaryFile('tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure InitializeUninstallProgressForm();
begin
with UninstallProgressForm do
begin
Width := ScaleX(755);
Height := ScaleY(500);
Position := poScreenCenter;
CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25));
with ProgressBar do
begin
Parent := UninstallProgressForm
SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
end;
//unins background bitmap image
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS');
SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
end;
OuterNotebook.Hide;
MainPanel.Hide;
Bevel1.Hide;
StatusLabel.Hide;
BeveledLabel.Hide;
Bevel.Hide;
end;
end;
function InitializeUninstall(): Boolean;
begin
if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
then
LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;
procedure DeinitializeSetup;
begin
UnloadSkin();
end;
скрин:
http://rghost.ru/private/39052454/cfe822f51738caa212efbc1e6aca924e/image.png (http://rghost.ru/private/39052454/cfe822f51738caa212efbc1e6aca924e.view)
архив со всем необходимым:
http://rghost.ru/private/39052497/4eda45115fb34c4e086d5eb1311ede98
===============================================================
FMA,
тебе не хватет флага
припиши ... ; Flags: foldershortcut
у тебя стоит {commondesktop}
ты уверен, что на общем рабочем столе ?
{userdesktop} - текущего пользователя
а также вот тебе русская справка http://sendfile.su/570136
Ivan_009
05-07-2012, 19:30
Source: BmpFiles\fon.bmp; DestDir: {app}; Attribs: hidden system;
Source: BmpFiles\fonAC.bmp; DestDir: {app}; Attribs: hidden system;
Johny777, а как загрузить 2 картинки на InitializeUninstallProgressForm(); пробую так неполучается :(
Ivan_009
05-07-2012, 21:58
Как сделать двойной прогресс бар тоесть вот такой через IsDone :sorry:
Johny777
05-07-2012, 22:48
Ваня,
как добавить ещё одну картинку в BitmapResource=unins:BloodRain_U.bmp не знаю
( Кстати! Оказывается очень удобно использовать для некоторых картинок секцию Setup :) ,
тк нет лишней писанины с добавлением картинок в секцию Files и их перемещением в темп. как чуть ниже )
поэтому так (приписал немного комментариев)
#define MyAppName "test"
[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
;BitmapResource=unins:BloodRain_U.bmp|unins:BloodRain_U2.bmp
[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic1.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic2.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function InitializeSetup:boolean;
begin
ExtractTemporaryFile('tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure InitializeUninstallProgressForm();
begin
with UninstallProgressForm do
begin
Width := ScaleX(757); /// ширина формы
Height := ScaleY(500); /// высота формы
Position := poScreenCenter; /// расположение формы в центре экрана
CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены
with ProgressBar do /// прогресбар
begin
Parent := UninstallProgressForm
SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
end;
/// если копирование этого и того файла в темп True, то
if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic1.bmp'), ExpandConstant('{tmp}\Pic1.bmp'), True) and
FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic2.bmp'), ExpandConstant('{tmp}\Pic2.bmp'), True)
then
begin /// создаём 2 безымянныйе картинки
//unins background bitmap image
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp')); /// грузим одну критнку
SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
end;
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic2.bmp')); /// грузим другую картинку
SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
end;
end;
OuterNotebook.Hide; /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
MainPanel.Hide;
Bevel1.Hide;
StatusLabel.Hide;
BeveledLabel.Hide;
Bevel.Hide;
end;
end;
function InitializeUninstall(): Boolean;
begin
if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
then
LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;
procedure DeinitializeSetup;
begin
UnloadSkin();
end;
и, Вань, зачем тебе 2 картинки?
склей в фотошопе в одну
(Создать - новый фон (настранваешь цвет фона и указываешь размер) - перетаскиваешь обе картинки на этот самый фон - растягиваешь и двигаешь до получения желаемого результата -
нажимаешь инструмент "Перемещение(V)" и при необходимости инструментом "Рамка (С)" кадрируешь (вырезаешь нужный участок)- сохраняешь в 32-битном(!).bmp - файле)
юзаю версию 5.1 (русскую)
Как сделать двойной прогресс бар тоесть вот такой через IsDone »
хз
исдан не знаю :(
------------------------------------------------------------------------------------Update
понял как добавлять картинки через Setup
пример в ...\Inno Setup 5\Examples\Example_BitmapResource.iss прояснил ситуацию!
сократил код
улучшенный результат:
#define MyAppName "test"
[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:Pic1.bmp|unins2:Pic2.bmp
[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function InitializeSetup:boolean;
begin
ExtractTemporaryFile('tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure InitializeUninstallProgressForm();
begin
with UninstallProgressForm do
begin
Width := ScaleX(757); /// ширина формы
Height := ScaleY(500); /// высота формы
Position := poScreenCenter; /// расположение формы в центре экрана
CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены
with ProgressBar do /// прогресбар
begin
Parent := UninstallProgressForm
SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
end;
/// создаём 2 безымянныйе картинки
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS'); /// грузим одну критнку
SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
end;
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS2'); /// грузим другую картинку
SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
end;
OuterNotebook.Hide; /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
MainPanel.Hide;
Bevel1.Hide;
StatusLabel.Hide;
BeveledLabel.Hide;
Bevel.Hide;
end;
end;
function InitializeUninstall(): Boolean;
begin
if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
then
LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
Result := True;
end;
procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;
procedure DeinitializeSetup;
begin
UnloadSkin();
end;
изменённые строки выделил жирным (3 строки)
Johny777
06-07-2012, 15:27
1. Переделал "проценты установки" под CallbackAddr
теперь библиотека "InnoCallback.dll" не нужна (нужна только расширенная версия Inno)
было так:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs
[code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
PercentsTimer: LongWord;
PercentsLabel: TLabel;
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
function NumToStr(Float: Extended): String;
begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;
procedure PercentsProc(h, msg, idevent, dwTime: Longword);
begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';
end;
end;
procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsLabel:= TLabel.Create(nil);
with PercentsLabel do
begin
SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
AutoSize:= True;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
if CurStep = ssPostInstall then
begin
KillTimer(0, PercentsTimer);
Application.Title := ' Готово';
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID=wpInstalling then
begin
Confirm := False;
case ExitSetupMsgBox of
True :
begin
PercentsLabel.Free;
Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
Cancel := True;
end;
False : Cancel := False;
end;
end;
end;
стало так:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
[Files]
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs
[code]
var
PercentsTimer: LongWord;
PercentsLabel: TLabel;
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function NumToStr(Float: Extended): String;
begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;
procedure PercentsProc;
begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %'; /// проценты на кнопке в панели задач
end;
end;
procedure DeinitializeSetup();
begin
KillTimer(WizardForm.Handle, PercentsTimer);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsLabel:= TLabel.Create(nil);
with PercentsLabel do
begin
SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
AutoSize:= True;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
PercentsTimer:= SetTimer(WizardForm.Handle, 0, 100, CallbackAddr('PercentsProc'));
end;
if CurStep = ssPostInstall then
begin
KillTimer(WizardForm.Handle, PercentsTimer);
Application.Title := ' Готово';
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID=wpInstalling then
begin
Confirm := False;
case ExitSetupMsgBox of
True :
begin
PercentsLabel.Free;
Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
Cancel := True;
end;
False : Cancel := False;
end;
end;
end;
Примечание:
кто не хочет отображения десятой доли процента после запятой удалите функцию
function NumToStr(Float: Extended): String;
begin
...
end;
и замените в процедуре
procedure PercentsProc;
NumToStr на IntToStr
===========================================================================================
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма)
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
[Files]
Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy
[code]
const
WM_MOVE = $3;
GWL_WNDPROC = -4;
type
TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint ;
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WndProcCallBack(P:TCallbackProc;ParamCount:integer ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
var
Form1: TForm;
OldProc: Longint;
function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;
procedure InitializeWizard();
begin
Form1:= TForm.Create(MainForm);
Form1.SetBounds(WizardForm.Left+WizardForm.Width+5 , WizardForm.Top, 100, 358);
Form1.BorderStyle:= bsSingle;
Form1.Show;
OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
end;
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;
речь идёт о функции:
function WndProcCallBack(P:TCallbackProc;ParamCount:integer ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
=================================================================================
3. и последнее:
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше :))
El Sanchez
07-07-2012, 11:36
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма) »
Johny777, замени WndProcCallBack(@MyProc, 4) на CallbackAddr('MyProc'), ну и удали ненужные объявленные тип TCallbackProc и функцию WndProcCallBack.
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше »
Типа так? - Form1 := TForm.Create(nil); Параметром конструктора Create указывается компонент-владелец создаваемого компонента, т.е. если мы создаем форму вот так - Form1 := TForm.Create(WizardForm), то владелец WizardForm отвечает за выделение/освобождение памяти для Form1 и при разрушении WizardForm автоматически разрушается и Form1. nil же означает, что у создаваемого компонента нет владельца, создается такой компонент значительно быстрее, но ответственность за освобождение памяти в случае, когда компонент уже не нужен, лежит на программисте (вызвать метод Free). Как-то так.
Ivan_009
07-07-2012, 21:07
Как в данном модуле удалить все ненужное и оставить только те функции которые нужны данной кнопке.... :unsure: заранее спасибо...
Johny777
07-07-2012, 23:15
Как в данном модуле удалить все ненужное и оставить только те функции которые нужны данной кнопке »
прочистил как мог (ботву тоже)
всё в одном коде
архив
http://rghost.ru/private/39092559/fce40d2c9e6a9e6c6fd1fb7dd0472c5b
код:
[Setup]
AppName=BassExample
AppVerName=BassExample
DefaultDirName={pf}\BassExample
Compression=none
[Files]
Source: BASS_Files\*; DestDir: {tmp}; Flags: dontcopy
Source: music.mp3; DestDir: {tmp}; Flags: dontcopy
[code]
/// кусок ботвы /// начало
type
TBtnEventProc = procedure(h:HWND);
procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h :HWND; EventID :integer; Event :Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
function BtnCreate(hParent :HWND; Left, Top, Width, Height :integer; FileName :PAnsiChar; ShadowWidth :integer; IsCheckBtn :boolean) :HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
/// конец
type
HSTREAM = DWORD;
TBASSTmrProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PAUSED = 3;
var
BASS_Volume: DWORD; BASS_Mp3Handle: HSTREAM;
BASS_OnOffBtn: HWND;
Songs: TStringList; SongTimer: Longword;
CurSong: Integer;
function _BASS_WrapTimerProc(callback: TBASSTmrProc; paramcount: integer):longword; external 'wrapcallbackaddr@{tmp}\callbackctrl.dll stdcall delayload';
function _BASS_SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall delayload';
function _BASS_KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall delayload';
function _BASS_Init(device: LongInt; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset1, offset2, length1, length2: DWORD; flags: DWORD): HSTREAM; external 'BASS_StreamCreateFile@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelIsActive(handle: DWORD): DWORD; external 'BASS_ChannelIsActive@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPause(handle: DWORD): Boolean; external 'BASS_ChannelPause@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelSetAttribute(handle: DWORD; Flags: DWORD; Value: Single): Boolean; external 'BASS_ChannelSetAttribute@{tmp}\BASS.dll stdcall delayload';
function _BASS_Stop(): Boolean; external 'BASS_Stop@{tmp}\BASS.dll stdcall delayload';
function _BASS_Free(): Boolean; external 'BASS_Free@{tmp}\BASS.dll stdcall delayload';
function _BASS_Start(): Boolean; external 'BASS_Start@{tmp}\BASS.dll stdcall delayload';
procedure BASSTimerProc(HandleW, msg, idEvent, TimeSys: LongWord);
begin
if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_STOPPED)and(Songs.Count>1) then begin
CurSong:= CurSong+1;
if CurSong>=Songs.Count then CurSong:=0;
_BASS_StreamFree(BASS_Mp3Handle);
BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, 0);
_BASS_ChannelPlay(BASS_Mp3Handle, False);
end;
end;
procedure BASS_Init(Mp3Name: String);
var
FSR: TFindRec; Flags: DWORD;
begin
if not FileExists(ExpandConstant('{tmp}\Bass.dll')) then ExtractTemporaryFile('Bass.dll');
if not FileExists(ExpandConstant('{tmp}\callbackctrl.dll')) then ExtractTemporaryFile('callbackctrl.dll');
Songs:= TStringList.Create;
Songs.Clear;
Mp3Name:= ExpandConstant(Mp3Name);
if FindFirst(Mp3name, FSR) then try
repeat
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
Songs.Add(AddBackslash(ExtractFilePath(Mp3Name))+FSR.Name);
until not FindNext(FSR);
finally
FindClose(FSR);
end;
CurSong:= 0;
_BASS_Init(-1, 44100, 0, 0, 0)
_BASS_Start();
if Songs.Count>1 then Flags:= 0 else Flags:= 4;
BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, Flags);
_BASS_ChannelPlay(BASS_Mp3Handle, False);
if Songs.Count>1 then
SongTimer:= _BASS_SetTimer(0, 0, 100, _BASS_WrapTimerProc(@BASSTimerProc, 4));
BASS_Volume:= 100;
_BASS_ChannelSetAttribute(BASS_Mp3Handle, 2, BASS_Volume/100.0);
end;
procedure BASS_DeInit();
begin
_BASS_Stop;
_BASS_Free;
if Songs.Count>1 then
_BASS_KillTimer(0, SongTimer);
Songs.Free;
end;
procedure BASS_OnOffClick(Handle: HWND);
begin
if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_PAUSED) then _BASS_ChannelPlay(BASS_Mp3Handle, False) else
_BASS_ChannelPause(BASS_Mp3Handle)
end;
procedure BASS_CreateOnOffButton(Parent: TWinControl; Image: String; Left, Top, Width, Height, ShadowWidth: Integer);
begin
BASS_OnOffBtn:= BtnCreate(Parent.Handle, ScaleX(Left), ScaleY(Top), ScaleX(Width), ScaleY(Height), ExpandConstant(Image), ShadowWidth, True)
BtnSetCursor(BASS_OnOffBtn,GetSysCursorHandle(32649));
BtnSetEvent(BASS_OnOffBtn, 1, WrapBtnCallback(@BASS_OnOffClick, 1))
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');
BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;
procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;
mariolast
08-07-2012, 10:39
Может кто еще пользуется botva2.dll
Хочу разрисовать прогрессбар при джеинсталляции
Но что то не так видимо делаю.
Затык на функции CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam);
Вызывает ошибку вызова процедуры
Вот кусок кода, может подскажете, в чем ошибка.
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function GetTickCountUn: DWORD; external 'GetTickCount@kernel32.dll stdcall uninstallonly';
...
...
function PBProcUn(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var
lt:Longint;
dt,at,pr,i1,i2:Extended;
p:string;
tc:DWORD;
begin
Result:=7;
Result:=CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam);
if (Msg=$402) and (UninstallProgressForm.Progressbar.Position>UninstallProgressForm.Progressbar.Min) then begin
i1:=UninstallProgressForm.Progressbar.Position-UninstallProgressForm.Progressbar.Min;
i2:=UninstallProgressForm.Progressbar.Max-UninstallProgressForm.Progressbar.Min;
tc:=GetTickCountUn;
if (tc-eTimeUn)>=1000 then begin
dt:=(tc-sTimeUn)/1000;
at:=i2*dt/i1;
lt:=Round(at-dt)
TimeLeftLabel.Caption:='Îñòàëîñü - '+LongintToStringTime(lt);
eTimeUn:=tc;
end;
pr:=i1*100/i2;
p:=' - ['+Format('%f',[pr])+'%]';
StringChange(p,',','.');
TimeLeftLabelUn.Caption:=WFCaption+p;
WizardForm.Caption:=WFCaption+p;
ImgPBSetPosition(NewPBun,pr);
ImgApplyChanges(UninstallProgressForm.Handle);
end;
end;
...
...
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Names: TArrayOfSting;
I, Errorcode: Integer;
S,RegAss: String;
begin
if CurUninstallStep=usUninstall then
begin
NewPBun:=ImgPBCreate(UninstallProgressForm.InstallingPage.Handle, ExpandConstant('{tmp}\pbbkg.png'), ExpandConstant('{tmp}\pb.png'),UninstallProgressForm.Progressbar.Left,UninstallProgressForm.Progress bar.Top,UninstallProgressForm.Progressbar.Width,25);
ImgApplyChanges(UninstallProgressForm.InstallingPage.Handle);
WFCaption:=UninstallProgressForm.Caption;
TimeLeftLabelUn:=TLabel.Create(nil);
with TimeLeftLabelUn do begin
Parent:=UninstallProgressForm.InstallingPage;
AutoSize:=False;
SetBounds(ScaleX(400),ScaleY(150),ScaleX(400),ScaleY(21));
Transparent:=True;
Font.Color:=clWhite;
Font.Style:= [fsBold];
end;
sTimeUn:=GetTickCountUn;
eTimeUn:=sTimeUn;
PBOldProcUn:=SetWindowLong(UninstallProgressForm.InstallingPage.Handle,-4,CallBackProc(@PBProcUn,4));
end;
sergey3695
08-07-2012, 16:28
PBOldProcUn:=SetWindowLong(UninstallProgressForm.InstallingPage.Handle,-4,CallBackProc(@PBProcUn,4));
может всё таки
UninstallProgressForm.Handle »
UninstPBOldProc:=SetWindowLong(UninstallProgressForm.ProgressBar.Handle,-4,CallBackProc(@UninstPBProc,4));
Наподобе этого. У меня так например.
mariolast
09-07-2012, 11:36
пальцем в небо
но попробуй
у меня в скрипте есть такая вот секция [LangOptions]
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl; InfoBeforeFile: Russian.rtf
Name: English; MessagesFile: compiler:Languages\English.isl; InfoBeforeFile: English.rtf
[LangOptions]
Russian.LanguageName=<0420><0443><0441><0441><043A><0438><0439>
Russian.LanguageID=$0419
Russian.LanguageCodePage=1251
English.LanguageName=English
English.LanguageID=$0409
English.LanguageCodePage=0 »
Это абсолютно не работает. нужен другой способ
Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами?
Окромя такого вот решения как здесь описано http://www.wylek.ru/forum/31-153-5718-16-1341169828
есть что то получше? »
Johny777,
Да не, еще скрипт ботвы надо было править оказывается. Разьяснили с этим вопросом уже работает.
Gnom_aka_Lexander
09-07-2012, 12:59
Окромя такого вот решения как здесь описано http://www.wylek.ru/forum/31-153-5718-16-1341169828
есть что то получше? » »
Помимо прочего, это решение пригодно только для юникод-компилятора. На анси не работает совсем.
[LangOptions] - такое решение пригодно только в том случае, еслои система хоть каким-нибудь боком знает русский язык - для русских либо позже русифицированных систем.
В общем, присоединюсь к вопросу.
El Sanchez
09-07-2012, 17:48
Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами? »
mariolast, попробуйте один из вариантов:
1. В апплете Regional and Language Options жмакнуть Advanced и выставить для Language for non-Unicode programs значение Russian. Перезагруз.
2. Если в системе есть какие-нибудь кириллические шрифты (нет - подгрузить свой), то использовать один из них, например:
[LangOptions]
LanguageName=Russian
DialogFontName=Arial Cyr
WelcomeFontName=Arial Cyr
TitleFontName=Arial Cyr
CopyrightFontName=Arial Cyr
FX-DENIS
10-07-2012, 00:27
Ребята подскажите.Проблема такая:нужно папку при установке инсталятора поместить в мои документы текущей системы и текущего пользователя,но так как системной переменной мои документы нет,то перепробовал несколько способов
1.бат файл,но сложно для меня
2.через секцию файлы
Source: "{userdocs}\ubisoft\*"; DestDir: "{userdocs}\ubisoft"; Flags: recursesubdirs replacesameversion createallsubdirs
папка ubisoft или создаеться без файлов внутри или создается с названием игры, а потом сама папка,если убрать флаг createallsubdirs то вообще ошибки или другие флаги применить, то ошибка на ошибке.
3.пробовал сжать нужную папку в SFX архив и запустить через секцию RUN ,но нет переменной мои документы,ну есть %MyDocuments% для ХP и %USERPROFILE%/Documents для 7,но я же не знаю на какой системе будет установлена игра,тогда придеться создавать скрипт который определяет какая система и в зависимости от этого запускает нужный SFX.
4.Способ которым сейчас пользуюсь, помог ,но все равно некрасивый и должен лежать рядом с Setup.exe
[Run]
Filename: "{src}\UnRAR.exe"; WorkingDir: "{src}"; Parameters: "x -O+ Ubisoft.rar ""{userdocs}\"""; Flags: waituntilterminated
Может как то можно все таки через секцию файлы, средствами инно,без танцев и независимо какая система и текущий пользователь,поместить папку в мои документы,при этом с файлами внутри и чтобы не создавалась сначала папка названия игры.То есть ,не Driver San Francisco\ubisoft ,а просто ubisoft.Сейчас пользуюсь способом 4,подскажите новичку.
Sanchez здравствуй,опять маленький вопросик, пример№1 который мне помог Серега и пример №2 от тебя скрипт для приведения размера устанавливаемого файла из байтовой формы в удобочитаемую,в чем отличие,поподробнее,у Сереги считывает размер файла после его копирования (фактически всегда пишется размер предыдущего файла) и +большие файлы более 3гб корректно,а твой пример?Расскажи плюсы и недостатки,если не сложно. :oszone:
Johny777
10-07-2012, 02:17
но так как системной переменной мои документы нет »
у тебя в коде константа {userdocs} и есть "Мои Докуметы" пользователя (текущего)
Хочешь скопировать папку "Ubisoft" с файлами в ней из "рядом с интсаллятором" в, например, C:\Users\Вася\Documents ?
Примеръ:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Files]
Source: {src}\Ubisoft\*; DestDir: {userdocs}\Ubisoft; Flags: external skipifsourcedoesntexist recursesubdirs createallsubdirs
;Откуда: снаружи\Ubisoft\содержимое(*); Туда: мои документы\Ubisoft; Флаги: (внешний) (пропустить(не выдавать ошибку) если источника нет)) (обрабатывать подкаталоги) (создавть эти самые подкаталоги там)
FX-DENIS
10-07-2012, 22:19
Джони я пробовал же,создается сначала в моих документах папка с названием самого приложения(игры),а потом внутри Ubisoft .если убрать флаги recursesubdirs createallsubdirs,то ошибки,то есть мне надо скопировать папку в мои документы текущего пользователя,без создания папки названия игры.И еще вопрос константа {userdocs} в XP сработает,как я понял это переменная самого инно,и ему не важно какая система?
Как сделать, чтобы компонет не становилсся жирным, когда его отмечаешь?
http://i43.fastpic.ru/big/2012/0712/a9/e04ced7a833662f94468437de5319ba9.png
procedure InitializeWizard;
begin
ExtractTemporaryFile('img.bmp')
WizardForm.ComponentsList.WantTabs:=True;
WizardForm.ComponentsList.LoadBGBmpFromFile(ExpandConstant('{tmp}\img.bmp'), WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);
end;
Johny777
12-07-2012, 12:12
t16bz,
WizardForm.ComponentsList.Flat := True;
Johny777, нет, это не помогло :(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.