Войти

Показать полную графическую версию : Скрипты 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

Gnom_aka_Lexander
21-02-2013, 19:26
не дружит со свёрнутым деревом компонентов »
Просто свернутые компоненты игнорируются при пересчете итемов компонент-листа, поскольку будучи свернутыми, в качестве компонентов контрола TCheckListBox они перестают существовать.

Johny777
21-02-2013, 19:47
качестве компонентов контрола TCheckListBox они перестают существовать »
но не полностью. Какой-то доступ к ним всё же есть. Например можно проверить отмечен тот или иной невидимый айлтем или нет и ещё кое-что:

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


[Components]
Name: en; Description: Портативный; Flags: disablenouninstallwarning exclusive collapsed
Name: ru; Description: Локализация; Flags: disablenouninstallwarning exclusive collapsed
Name: ru\8Bit; Description: 8Bit; Flags: exclusive disablenouninstallwarning
Name: ru\Fargus; Description: Fargus; Flags: exclusive disablenouninstallwarning
Name: bs\7Wolf; Description: 7Wolf; Flags: disablenouninstallwarning exclusive


[ code]
procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
MsgBox('ItemsCount:' + #32 + IntToStr(Items.Count), mbInformation, MB_OK);
if ItemObject[4] <> nil then MsgBox('Exist!', mbInformation, MB_OK);
if not Checked[2] then MsgBox('Not Checked', mbInformation, MB_OK);
end;
end;

Gnom_aka_Lexander
21-02-2013, 19:50
Johny777, ключевое словсочетание: в качестве компонентов контрола TCheckListBox »
я предельно ясно и абсолютно подробно выражаю свои мысли.
Как именно реализована булевая проверка скрытых компонентов - мне без разницы, но готов спорить, что в этой проверке сам TCheckListBox вообще никак не участвует.

insombia
21-02-2013, 23:25
у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1?

Johny777
22-02-2013, 04:17
готов спорить, что в этой проверке сам TCheckListBox вообще никак не участвует »
да фиг с ним! ;)

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

у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1? »
1. через создание мьютекса встроенными средствами - CreateMutex(...): http://forum.oszone.net/post-1708051-2236.html

2. через создание семафора - CreateSemaphore(...) :

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
SYNCHRONIZE = $00100000;
STANDARD_RIGHTS_REQUIRED = $000F0000;
SEMAPHORE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3);

SEMAPHORE_UNIQUE_NAME = 'Johny777';


function CreateSemaphore(lpSemaphoreAttributes, lInitialCount, lMaximumCount: Longint; lpName: String): THandle; external 'CreateSemaphore{#A}@kernel32.dll stdcall';
function OpenSemaphore(dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: String): THandle; external 'OpenSemaphore{#A}@kernel32.dll stdcall';
function ReleaseSemaphore(hSemaphore: THandle; lReleaseCount: Longint; lpPreviousCount: Longint): BOOL; external 'ReleaseSemaphore@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
hSemaphore: THandle;

function InitializeSetup(): Boolean;
begin
Result := OpenSemaphore(SEMAPHORE_ALL_ACCESS, False, SEMAPHORE_UNIQUE_NAME) = 0;
if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
hSemaphore := CreateSemaphore(0, 1, 1, SEMAPHORE_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
ReleaseSemaphore(hSemaphore, 1, 0);
CloseHandle(hSemaphore);
end;

3. добавление строки в глобальный массив записей винды - GlobalAddAtom(...):

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
ATOM_UNIQUE_NAME = 'Johny777';

type
ATOM = Word;

function GlobalAddAtom(lpString: String): ATOM; external 'GlobalAddAtom{#A}@kernel32.dll stdcall';
function GlobalFindAtom(lpString: String): ATOM; external 'GlobalFindAtom{#A}@kernel32.dll stdcall';
function GlobalDeleteAtom(nAtom: ATOM): ATOM; external 'GlobalDeleteAtom@kernel32.dll stdcall';


var
aAtom: ATOM;

function InitializeSetup(): Boolean;
begin
Result := GlobalFindAtom(ATOM_UNIQUE_NAME) = 0;
if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
aAtom := GlobalAddAtom(ATOM_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
GlobalDeleteAtom(aAtom);
end;

4. через поиск заголовка окна своей программы:

function InitializeSetup(): Boolean;
begin
Result := FindWindowByWindowName(FmtMessage(SetupMessage(msgSetupWindowTitle), ['{#SetupSetting("AppName")}'])) = 0;
if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
end;

5. путём сохранения скрытого файла на харде, проверке его наличия и удаления по завершении работы инсталла

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
FILE_NAME = '\I_am_running';

function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';

var
LaunchError: Boolean;

function InitializeSetup(): Boolean;
begin
Result := not FileExists(ExpandConstant('{sd}') + FILE_NAME);
LaunchError := Result;
if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
SaveStringToFile(ExpandConstant('{sd}') + FILE_NAME, '', False);
SetFileAttributes(ExpandConstant('{sd}') + FILE_NAME, FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;


procedure DeinitializeSetup();
begin
if LaunchError then DeleteFile(ExpandConstant('{sd}') + FILE_NAME);
end;

6. как и по номеру 5. только сохранять ключ реестра. Извиняй, примера нет, тк с реестром у меня туго :(

7. Уверен есть ещё способы!
==================================================================================================== =================

Пацаны, подскажите пожалуйста. Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. Вот содержание ини:
Он заполняется единицами при необходимости

procedure CreateInstallINI();
begin
SaveStringsToFile(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Install.ini'), [
'[Parameters]',
'Launch_hl2=',
'Launch_hl2_ep1=',
'Launch_hl2_ep2=',
'Launch_portal=',
'',
'[Installed]',
';Half-Life 2',
'hl2=',
'hl2_ru=',
'hl2_ru_buka=',
'hl2_en=',
'hl2_ru_en=',
'AuroraB=',
'',
';Half-Life 2 Episode One',
'ep1=',
'ep1_ru=',
'ep1_en=',
'ep1_ru_en=',
'',
';Half-Life 2 Episode Two',
'ep2=',
'ep2_ru=',
'ep2_en=',
'ep2_ru_en=',
'',
';Portal',
'portal=',
'portal_ru=',
'portal_en=',
'portal_ru_en=',
'',
';Common ',
'Start_Folder_Exist='
],False);
end;

мне нужно создать ключ или ключи?
просветите пожалуйста неуча :)

Gnom_aka_Lexander
22-02-2013, 09:01
Johny777, по вопросу - ты-же сохранил реестр самой игры? Вот по аналогии создавай свой куст в Software и пиши там чего хочешь, главное не забывать убирать за собой. По ответу - 5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает, даже если инсталл не дошел до процедуры InitializeWizard, соответственно повторно запущеный инсталл не запустится, но он уберет ограничитель и будучи запущеным еще раз, будет уже запущен как повторный свободно. Можно конечно, добавить несколько флагов и с их помощью проверять, что именно не дало запустится инсталлятору, но это все костыли. В инно, как я уже писал, специально для этого в секции Setup есть параметры для работы с мьютексом, плюс встроенные функции создания мьютекса из секции кода. Господину insombia просто лень заглянуть в справку, там все это есть. Если никто не обратил внимания, Инсталлятор самого Inno Setup так-же использует мьютекс, пример скрипта лежит в папке установки, если устанавливаете IsPack версию, можно поизучать, если лень головой поработать.

Johny777
22-02-2013, 13:46
ты-же сохранил реестр самой игры? »
у меня пиратка не ориентируется на язык клиента Стима в реестре. Другие ключи не нужны, те я никакх ключей не сохраняю
Вот по аналогии создавай свой куст в Software и пиши там чего хочешь »
а как насчёт ключа удаления куда инно пишет все свои данные: путь к деинсталятору, выбранные компонент, язык и пр.
Мне можно создать создать там запись? Ведь это удобно, тк при полном удалении она, инно, и мои ключи потрёт
Если да то мне создавать там куст или ключ?
Можно ли сохранить весь ини с его структурой в реестре в одной записи?
Это удобно, тк я заргузил бы его немного изменённой функцией El Sanchez-а и прочитал бы как ини и не нужно код переписывать?


5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает »
исправил в пред. сообщении. Хватило одной булев переменной :)

Gnom_aka_Lexander
22-02-2013, 13:50
Хватило одной булев переменной »
Отнюдь. Отрицательный результат функции InitializeSetup может зависеть не только от наличия контрольного файла - записи. может быть целая куча вариантов.
По реестру:
// Registry functions
// проверка
function RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;
function RegValueExists(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
// чтение массива
function RegGetSubkeyNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
// чтение
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultDWord: Cardinal): Boolean;
function RegQueryBinaryValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: AnsiString): Boolean;
// запись
function RegWriteStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteExpandStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; const Data: Cardinal): Boolean;
function RegWriteBinaryValue(const RootKey: Integer; const SubKeyName, ValueName, Data: AnsiString): Boolean;
// удаление
function RegDeleteKeyIncludingSubkeys(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteKeyIfEmpty(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteValue(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;

El Sanchez
22-02-2013, 18:01
Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. »
Johny777, используй RegisterPreviousData, GetPreviousData, SetPreviousData для регистрации своих настроек в реестре.

tsskz
23-02-2013, 12:25
вот такая проблемка - как в этом скрипте убрать страницу выбора компонентов ?
на нем я по тихоньку на досуге учусь,если что

insombia
23-02-2013, 12:55
tsskz скрипт нужно весь заливать чтобы можно было проверить на работоспособность

tsskz
23-02-2013, 13:49
tsskz скрипт нужно весь заливать чтобы можно было проверить на работоспособность
ок http://rghost.ru/44045130

insombia
23-02-2013, 15:00
tsskz удали
#ifdef Components
//=====[ SelectComponents Page ]=====\\:
SelectComponentsPnl:= TPanel.Create(WizardForm);
with SelectComponentsPnl do
begin
Parent:= WizardForm;
SetBounds(ScaleX(575), ScaleY(70), ScaleX(554), ScaleY(220));
BevelOuter:= bvNone;
end;

PanelBG[2]:= TBitmapImage.Create(WizardForm);
with PanelBG[2] do
begin
Parent:= SelectComponentsPnl;
SetBounds(ScaleX(-575), ScaleY(-70), ScaleX(554), ScaleY(290));
Bitmap:= WizardBitmapImage.Bitmap;
end;

SelectComponentsLbl:= LabelCreateEx(SelectComponentsPnl, CustomMessage('SelectComponentsLbl'), ScaleX(30), ScaleY(10), ScaleX(504), ScaleY(30), 15, 1, clBlack, $e5e5e5, false, false, taLeftJustify);
with ComponentsList do
begin
Parent:= SelectComponentsPnl;
SetBounds(ScaleX(30), ScaleY(50), ScaleX(490), ScaleY(150));
LoadBGBmpFromBitmap(WizardBitmapImage.Bitmap, ScaleX(34), ScaleY(122));
MinItemHeight:= ScaleY(20);
ItemHeightFixed:= True;
WantTabs:= True;
Font.Handle := ReFont(15, 4, 'Arial');
end;
//=====[ SelectComponents Page ]=====\\;
#endif

Raf-9600
23-02-2013, 17:23
Ктонить подскажет нубу, как в секции [Cоde] можно прописать условие, чтобы определённый код срабатывал только на Win7 и выше?

insombia
23-02-2013, 18:52
прикрутите кто-то мне в скрипт текстурированные кнопки,а то не получается,и при распаковке кнопка отмены стает исдоновкая а я хочу чтобы была дефольтная
http://rghost.ru/44053363

Johny777
23-02-2013, 18:56
Raf-9600,

function InitializeSetup(): Boolean; // Win7 = 6.1, Win8 = 6.2
var
WindowsVersion: TWindowsVersion;
begin
GetWindowsVersionEx(WindowsVersion);
if (WindowsVersion.Major >= 6) and (WindowsVersion.Minor >= 1) then MsgBox('Заместо меня какое-то действие! :)', mbInformation, MB_OK);
end;


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

Gnom_aka_Lexander, Зачем мне прототипы, я их уже видел .( Как раз на них и смотрел во вкладке компилятора когда ты мне их запостил :) )
Я спрашивал:
как насчёт ключа удаления куда инно пишет все свои данные ... Мне можно создать там запись »
Если да то мне создавать там куст или ключ? »
Можно ли сохранить весь ини с его структурой в реестре в одной записи? »

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

El Sanchez,
Спасибо, буду разбираться! :) Эти три функции всё, что мне нужно?

tsskz
23-02-2013, 20:29
insombia
выдает ошибку could not call proc.

insombia
23-02-2013, 21:41
tsskz какое инно используешь?

El Sanchez
23-02-2013, 22:34
Эти три функции всё, что мне нужно? »
Johny777, да, их достаточно. Для твоего ini-файла достаточно будет 2-х регистрируемых параметров (по числу секций в ini). Не разберешься - обращайся.

Lex_from_Belarus
24-02-2013, 10:56
Подскажите пожалуйста у меня в Tasks есть галочка, которую если поставить, то отключиться копирование uninstaller'a, а дальше есть 2 галочки которые добавляют ярлыки на него на рабочий стол и в Пуск, так вот как сделать так чтобы когда галочку ставишь и Uninstaller не устанавливается во время установки, то и 2 галочки на ярлыки не показывались. Когда прописываешь ярлыки на компоненты там понятно связь задаётся с компонентами через Components, а как связать Tasks не знаю.




© OSzone.net 2001-2012