Войти

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


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

Johny777
19-01-2013, 15:11
R.i.m.s.k.y., на этапе ssDone WizardForm.RunList уже не существует и соответственно будут ошибки, придётся работать только с переменными
Vstanka, предлагаю такой способ:

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

[Components]
Name: server; Description: Install Server; Types: full custom;

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

type
RUNLIST_BOOL_COLLECTION = record
Application: BOOL;
Server: BOOL;
end;

var
Run: RUNLIST_BOOL_COLLECTION;

const
QS_KEY = $0001;
QS_MOUSEMOVE = $0002;
QS_MOUSEBUTTON = $0004;
QS_POSTMESSAGE = $0008;
QS_TIMER = $0010;
QS_PAINT = $0020;
QS_SENDMESSAGE = $0040;
QS_HOTKEY = $0080;
QS_MOUSE = (QS_MOUSEMOVE or QS_MOUSEBUTTON);
QS_INPUT = (QS_MOUSE or QS_KEY);
QS_ALLEVENTS = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY);
QS_ALLINPUT = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY or QS_SENDMESSAGE);
STATUS_TIMEOUT = $00000102;
WAIT_TIMEOUT = STATUS_TIMEOUT;

function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD; external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEvent{#A}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeIntervalA@shlwapi.dll stdcall';

function TicksToTime(Ticks: DWORD): String;
var
i: Byte;
arr: array [0..31] of Char;
begin
for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

procedure Delay(dwMilliseconds: DWORD; hElapstedTimeInfo: HWND);
var
dwTick: DWORD;
hEvent: THandle;
begin
hEvent := CreateEvent(0, False, False, '');
try
dwTick := GetTickCount + dwMilliseconds;
while (dwMilliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, dwMilliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
dwMilliseconds := dwTick - GetTickCount;
if hElapstedTimeInfo <> 0 then SetWindowText(hElapstedTimeInfo, 'запуск приложения через' + TicksToTime(dwMilliseconds));
end;
finally
CloseHandle(hEvent);
end;
end;



procedure RunListOnClickCheck(Sender: TObject);
begin
with WizardForm.RunList do if (Items.IndexOf('запуск приложения') <> -1) and (Items.IndexOf('запуск сервера БД') <> -1) then
begin
ItemEnabled[Items.IndexOf('запуск приложения')] := Checked[Items.IndexOf('запуск сервера БД')];
Refresh;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
WaitingForm: TForm;
StaticText: TNewStaticText;
begin
if CurStep = ssDone then
begin
if Run.Server then Exec(ExpandConstant('{app}\server.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewNoWait, ErrorCode);
if Run.Application then
begin
WaitingForm := TForm.Create(nil);
with WaitingForm do
begin
ClientWidth := ScaleX(200);
ClientHeight := ScaleY(50);
Position := PoscreenCenter;
BorderStyle := bsDialog;
Caption := 'Waiting';
StaticText := TNewStaticText.Create(WaitingForm)
with StaticText do
begin
Parent := WaitingForm;
SetBounds(ScaleX(10), ScaleY(20), ScaleX(180), ScaleY(20));
end;
Show;
Delay(20000, StaticText.Handle);
end;
WaitingForm.Free;
Exec(ExpandConstant('{app}\hl.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewNoWait, ErrorCode);
end;
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if (CurPageID = wpFinished) then with WizardForm.RunList do
begin
if (Items.IndexOf('запуск приложения') <> -1) and (Items.IndexOf('запуск сервера БД') <> -1) then
begin
Run.Server := Checked[Items.IndexOf('запуск сервера БД')];
Run.Application := ItemEnabled[Items.IndexOf('запуск приложения')] and Checked[Items.IndexOf('запуск приложения')];
Items.Delete(Items.IndexOf('запуск сервера БД'));
Items.Delete(Items.IndexOf('запуск приложения'));
Result := True;
end;
end else Result := True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID = wpFinished) and IsComponentSelected('server') then with WizardForm.RunList do
begin
AddCheckBox('запуск сервера БД', '', 0, True, True, False, False, nil);
AddCheckBox('запуск приложения', '', 0, True, True, False, False, nil);
WizardForm.RunList.OnClickCheck := @RunListOnClickCheck;
Refresh;
Visible := True;
end;
end;


к тому же заметил аномалию: если вручную добавить айтемы в RunList и установить в них галки, то при разрушении WizardForm ошибки, что их нет, поэтому их нужно удалить до деинициализации

R.i.m.s.k.y.
19-01-2013, 15:15
на этапе ssDone WizardForm.RunList уже не существует и соответственно будут ошибки »
вообще-то это копипаста с моего заведомо рабочего кода
спецом проверил еще раз - работает

____________

Вопросик - чего при использовании bass.dll установщик падает с ошибкой в dsound.dll?

Имя сбойного модуля: dsound.dll, версия: 6.1.7600.16385, отметка времени 0x4a5bd9fd
Код исключения: 0xc0000005
Смещение ошибки: 0x00008d5f
Идентификатор сбойного процесса: 0xbc0
Время запуска сбойного приложения: 0x01cdf61ca4396b84
Путь сбойного приложения: r:\Temp\is-UK9B7.tmp\setup.tmp
Путь сбойного модуля: C:\Windows\system32\dsound.dll
Код отчета: e7c10c04-620f-11e2-b72e-d43a4e0c59f8

R.i.m.s.k.y.
19-01-2013, 16:21
к тому же заметил аномалию: если вручную добавить айтемы в RunList и установить в них галки, то при разрушении WizardForm ошибки, что их нет, поэтому их нужно удалить до деинициализации »
блин какие-то разные у нас инно, ничего подобного у меня нет
Пользуюсь инноультра какой-то лохматой версии, инно компилер 5.4.2.ее2(а), билд 110319

R.i.m.s.k.y.
19-01-2013, 20:57
еще вопросил по bass.dll - какие форматы он умеет?
в описании чказано xm/mod, запускаю - тишина, хотя мр3 работает

insombia
20-01-2013, 00:03
подскажите как правильно распаковывать файлы precomp'a,а то я запаковал а они не распаковываются через скрипт isdone,пишет не найдены файлы precomp

Mailchik
20-01-2013, 01:27
еще вопросил по bass.dll - какие форматы он умеет? »WAV, AIFF, MP3, MP2, MP1, OGG, MOD, IT, XM, S3M.в описании чказано xm/mod, запускаю - тишина, хотя мр3 работает »надо через другую функцию запускать.
вот пример накидал для xm: ссылка (http://rghost.ru/private/43164895/51cd9fd3e8b37bc462b66c9046d22c43) подскажите как правильно распаковывать файлы precomp'a,а то я запаковал а они не распаковываются через скрипт isdone,пишет не найдены файлы precomp »прекомп не пакует, он разжимает.. лучше его не использовать, пока не поймете для чего он.

insombia
20-01-2013, 10:43
Mailchik а srep как распаковать?

R.i.m.s.k.y.
20-01-2013, 10:50
а srep как распаковать »
srep.exe -d setup-1.rep setup-1.bin

Поставил на установщик скин через ISSkinEx.dll, но вот заковыка - самое начальное окно выбора языка установщика не "скинится".
Не сутба или есть способ?

Nikish X
20-01-2013, 16:33
А как в модуле FreeArc сделать запрос второго диска?

neorom
20-01-2013, 17:15
Как извлечь правельно скрипт из секциєю CODE(або только секцию CODE), с из исталяцийки ?

Mailchik
20-01-2013, 17:30
Nikish X, function ShowChangeDiskWindowfunction ShowChangeDiskWindow (Text, DefPath, SearchFile: string):boolean; показывает диалог с запросом следующего диска и ожиданием появления в DefaultPath файла, указанного SearchFile. Свой текст запроса можно указать значением Text;
DefaultPath - должен обязательно указывать {src}, иначе работоспособность не гарантируется;
SearchFile - файл, который каждые 0,2 секунды ищется по указанному пути;
Существует возможность в запросе сменить путь на другой, и если там будет найден SearchFile, то все последующие {src} в функциях распаковки будут идентифицироваться как указанный в данном диалоге путь.neorom, никак.
R.i.m.s.k.y., Ставь через простой ISSkin.dll. Пример как полностью заскинить окно выбора языка: #ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

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

[Files]
Source: ISSkin{#A}.dll; Flags: dontcopy;
Source: ISSkin.cjstyles; Flags: dontcopy;

[code]
var
mySelectLanguageForm: TForm;
mySelectLabel: TLabel;
myLangCombo: TNewComboBox;
myOKButton: TButton;
myCancelButton: TButton;
myIconBitmapImage: TBitmapImage;
bCancel: Boolean;
OldProc: Longint;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin{#A}.dll stdcall';
procedure UnloadSkin();
external 'UnloadSkin@files:isskin{#A}.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
external 'CallWindowProc{#A}@user32.dll stdcall delayload';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
external 'SetWindowLong{#A}@user32.dll stdcall delayload';

function NewProc(h: hwnd; Msg, wParam, lParam: Longint): Longint;
begin
if (Msg = $0112) then begin
if (wParam = 61536) then begin
myCancelButton.OnClick(myCancelButton);
wParam := 0;
end;
end;
Result := CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure myOKButtonClick(Sender: TObject);
begin
SelectLanguageForm.LangCombo.ItemIndex := myLangCombo.ItemIndex;
mySelectLanguageForm.Close;
SetWindowLong(mySelectLanguageForm.Handle, -4, OldProc);
end;

procedure myCancelButtonClick(Sender: TObject);
begin
mySelectLanguageForm.Close;
bCancel := True;
SetWindowLong(mySelectLanguageForm.Handle, -4, OldProc);
end;

procedure mySelectLanguageFormP;
begin
with SelectLanguageForm do begin
mySelectLanguageForm := TForm.Create(nil);
with mySelectLanguageForm do begin
ClientWidth := ScaleX(300);
ClientHeight := ScaleY(125);
BorderIcons := [biSystemMenu];
BorderStyle := bsDialog;
Caption := SelectLanguageForm.Caption;
Position := poScreenCenter;
end;
mySelectLabel := TLabel.Create(mySelectLanguageForm);
with mySelectLabel do begin
Parent := mySelectLanguageForm;
AutoSize := False;
WordWrap := True;
SetBounds(SelectLabel.Left, SelectLabel.Top,
SelectLabel.Width, SelectLabel.Height);
Caption := SelectLabel.Caption;
end;
myLangCombo := TNewComboBox.Create(mySelectLanguageForm);
with myLangCombo do begin
Parent := mySelectLanguageForm;
SetBounds(LangCombo.Left, LangCombo.Top,
LangCombo.Width, LangCombo.Height);
Items := LangCombo.Items;
Style := csDropDownList;
Sorted := True;
ItemIndex := LangCombo.ItemIndex;
end;
myOKButton := TButton.Create(mySelectLanguageForm);
with myOKButton do begin
Parent := mySelectLanguageForm;
SetBounds(OKButton.Left, OKButton.Top,
OKButton.Width, OKButton.Height);
Caption := OKButton.Caption;
OnClick := @myOKButtonClick;
end;
myCancelButton := TButton.Create(mySelectLanguageForm);
with myCancelButton do begin
Parent := mySelectLanguageForm;
SetBounds(CancelButton.Left, CancelButton.Top,
CancelButton.Width, CancelButton.Height);
Caption := CancelButton.Caption;
OnClick := @myCancelButtonClick;
end;
myIconBitmapImage := TBitmapImage.Create(mySelectLanguageForm);
with myIconBitmapImage do begin
Parent := mySelectLanguageForm;
SetBounds(IconBitmapImage.Left, IconBitmapImage.Top,
IconBitmapImage.Width, IconBitmapImage.Height);
Bitmap := IconBitmapImage.Bitmap;
end;
end;
OldProc := SetWindowLong(mySelectLanguageForm.Handle, -4, CallbackAddr('NewProc'));
mySelectLanguageForm.ShowModal;
mySelectLanguageForm.Free;
end;

function InitializeLanguageDialog(): Boolean;
begin
ExtractTemporaryFile('ISSkin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\ISSkin.cjstyles'), '');
mySelectLanguageFormP;
Result := False;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

function InitializeSetup(): Boolean;
begin
if bCancel then
Result := False else Result := True;
end;

alert30
20-01-2013, 17:48
neorom, никак. »
Есть исключение, что какиие-нибудь программы, упакованными официальными инсталляторами (которые скачаны с оф. сайта Inno) иногда может распаковать со скриптом.

R.i.m.s.k.y.
20-01-2013, 18:10
Пример как полностью заскинить окно выбора языка: »
---------------------------
Ошибка компиляции
---------------------------
Invalid prototype for 'InitializeLanguageDialog'

иногда может распаковать со скриптом. »
без пароля и шифрации
Секция кода только в виде bin файла

sergey3695
20-01-2013, 18:41
---------------------------
Ошибка компиляции
---------------------------
Invalid prototype for 'InitializeLanguageDialog' »
Поставь последнюю расширенную версию от китайцев.
Mailchik, по-моему проще было написать в mySelectLanguageForm.OnClose. чем изголятся и на крестик что-то ставить. ну хотя оно и так работать будет как надо.

neorom
20-01-2013, 22:29
Возможно где-то єсть архив скриптов инсталашок для разних програм ?

Raf-9600
21-01-2013, 10:38
А имя инсталлятора можно как-то вычислить? Мне его нужно передать как параметр для запуска одного файла...

Mailchik
21-01-2013, 12:05
Raf-9600, ExpandConstant('{srcexe}') - полный путь до инсталлятора
ExtractFileName(ExpandConstant('{srcexe}')) - имя инсталлятора

alert30
21-01-2013, 14:12
neorom, шапка для чего или идите к богу по имени "Гугл", он все знает.

З.Ы. В соседней теме там тоже много плюшевых скриптов.

insombia
21-01-2013, 18:36
блин не могу понять как среп распаковать,фриакр архивы распаковывает,а среп нет

elmariacci
23-01-2013, 13:00
Доброго времени суток.Перерыл гору информации,но т.к. с программой только начал учиться работать - не все происходит быстро.
Суть проблеммы такова: в инсталяторе для одного из компонентов необходима проверка в реестре на наличие в системе Microsoft .NET Framewok 3.5 (именно 3.5, а не 4+) и библиотеки Dokan .При отсутствии их в системе должна быть установка пост-инсталлом оригинальными экзэшниками,тк Redistributable Package весят слишком много.А вот если в системе есть и то и другое,просто заканчивается сетап .Пробовал через секцию run с условием выбора компонента,но тогда в любом случае запускается instal.exe Fraimwork и Dokan.Буду премного благодарен,если кто поможет сварганить такой кусочек...




© OSzone.net 2001-2012