Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
R.i.m.s.k.y.
02-09-2015, 14:33
вот такой
procedure DeinitializeSetup();
begin
BASS_DeInit; //Освобождаем процесс
gdipShutdown
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
WizardForm.Hide;
Sleep(200);
ShowWindow(WizardForm.Handle,0);
UnloadSkin();
RF(ExpandConstant('{src}\!!!.txt'));
end;
если при старте установщика в окне выбора языка нажать "отмена" то вываливается ошибка на строчке ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
Подскажите, как избавиться?
El Sanchez
02-09-2015, 16:00
этот способ не прокатывает тк МС в великой мудрости сменила инсталлер с MSI на что-то другое »
R.i.m.s.k.y., это что-то другое (https://en.wikipedia.org/wiki/WiX#Burn) содержит в себе 2 msi, так что способ прокатывает.
не прокатит - если установщик запущен не под одмином доступ к hklm может блокироваться »
R.i.m.s.k.y., с чего вдруг? Читать можно всем.
ругается на синтаксис case (syntax error)
что ему не нравится? »
R.i.m.s.k.y., двойные кавычки вместо одинарных, нет точки с запятой после каждого выбора.
если при старте установщика в окне выбора языка нажать "отмена" то вываливается ошибка на строчке ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0); »
R.i.m.s.k.y., форма-то еще не проинициализирована, {wizardhwnd} нема, а ShowWindow уже чего-то хочет. Да и незачем временно скрывать форму при выгрузке скина.
Если в DeinitializeSetup есть обращение к WizardForm или {wizardhwnd}, то нужно делать проверку:
if ExpandConstant('{wizardhwnd}') <> '0' then
// что-то делаем с WizardForm или {wizardhwnd}
R.i.m.s.k.y.
02-09-2015, 16:14
что-то другое содержит в себе 2 msi, так что способ прокатывает. »
я в темпах шарился во время установки - нет там MSI
где он лежит или как его вытащить?
с чего вдруг? Читать можно всем. »
хз
сталкивался с тем что во время установки чтение оттуда выдает пустые строки
форма-то еще не проинициализирована, {wizardhwnd} нема, а ShowWindow уже чего-то хочет. »
я знаю,
теперь выдает ошибку could not call proc на строчке
if ExpandConstant('{wizardhwnd}') <> '0' then begin
R.i.m.s.k.y.
02-09-2015, 16:45
а как называется функция, инициализирующая окошко выбора языка? что-то initializelanguagewindow чтоле? попробую через нее
R.i.m.s.k.y.
02-09-2015, 17:00
вывернулся
var FormInitialized : boolean;
function InitializeLanguageDialog(): Boolean;
begin
FormInitialized := false;
...
end;
procedure DeinitializeSetup();
begin
if (FormInitialized) then begin
BASS_DeInit; //
gdipShutdown
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
WizardForm.Hide;
Sleep(200);
ShowWindow(WizardForm.Handle,0);
UnloadSkin();
RF(ExpandConstant('{src}\!!!.txt'));
end;
end;
procedure InitializeWizard();
begin
FormInitialized := true;
...
end;
Stealthmax
08-09-2015, 12:30
Подскажите, а есть ли адекватное решение для работы с REG_BINARY?
function GetHKLM: Integer;
begin
if IsWin64 then
Result := HKLM64
else
Result := HKLM32;
end;
procedure InitializeWizard();
var
RegKey10: AnsiString;
begin
RegQueryBinaryValue(GetHKLM(), 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes', RegKey10);
MsgBox(RegKey10, mbInformation, MB_OK);
end;
Сам твик в формате *.reg :Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder]
"Attributes"=hex:70,01,00,20
В таком виде не выводит в окне сообщения что-либо вразумительное. Как получить читабельный вид значения, чтобы возможно было его прочитать/сравнить/записать?
Решение найдено:
function GetRegBinStr(key: integer; subkey, value: string): string;
var s: Ansistring;
i: integer;
begin
RegQueryBinaryValue(key, subkey, value, s);
for i := 1 to Length(s) do
begin
result := result + Format('%.2x', [Ord(s[i])]);
if not (i = Length(s)) then result := result + ',';
end;
end;
function HexToStr(str_hex: string): string;
var
i: Integer;
begin
StringChange(str_hex, ',', '');
for i:= 1 to Length(str_hex) div 2 do
Result:= Result + Chr(StrToInt('$' + Copy(str_hex, (i-1)*2+1, 2)));
end;
function GetHKLM: Integer;
begin
if IsWin64 then
Result := HKLM64
else
Result := HKLM32;
end;
procedure InitializeWizard();
var
RegKey10: AnsiString;
S: string;
begin
RegKey10:= GetRegBinStr(GetHKLM(), 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes'); //получаем значение из реестра и конвертируем в читабельный вид
MsgBox(RegKey10, mbInformation, MB_OK); //смотрим что на выходе
S:= '70,01,00,20'; //задаем свое значение
RegKey10:= HexToStr(S); //конвертируем значение в hex
RegWriteBinaryValue(GetHKLM(), 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes', RegKey10); //пишем в реестр
//здесь можно посмотреть результат записи в том же порядке, убрать комментарий строк ниже для наглядности работы
//RegKey10:= GetRegBinStr(GetHKLM(), 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes');
//MsgBox(RegKey10, mbInformation, MB_OK);
end;
P.S. Отдельная благодарность Serega за функцию HexToStr (http://forum.oszone.net/post-1329764-1003.html)
P.P.S. Ключ для теста лучше заменить, например, на такой 'SOFTWARE\Test', 'Test', т.к. в моем примере закрытый ключ на запись, но это уже другая история(SetACL).
El Sanchez
08-09-2015, 15:48
Подскажите, а есть ли адекватное решение для работы с REG_BINARY? »
Stealthmax, неадекватного здесь только функция GetHKLM.
Как получить читабельный вид значения »
Stealthmax, зачем? Бинарные данные некрасивы в любом виде. В данном примере после вызова RegQueryBinaryValue некрасивое значение переменной RegKey10 эквивалентно некрасивой строке #$70#$01#$00#$20.
Stealthmax
08-09-2015, 16:01
неадекватного здесь только функция GetHKLM. »
А как корректнее подключить взаимодействие HKLM64 и HKLM32? У меня обработка веток происходит в соответствии с разрядностью системы, т.е. на x64 у меня отработал скрипт, на x86 пока не тестировал.В данном примере после вызова RegQueryBinaryValue некрасивое значение переменной RegKey10 эквивалентно некрасивой строке #$70#$01#$00#$20 »
А с учетом уже найденного решения?
El Sanchez
08-09-2015, 16:35
А как корректнее подключить взаимодействие HKLM64 и HKLM32? У меня обработка веток происходит в соответствии с разрядностью системы, т.е. на x64 у меня отработал скрипт, на x86 пока не тестировал. »
Stealthmax, да оно-то при чтении может и ничего, но если писать, то может оказаться, что на 64-разрядной системе CLSID находится не только в 64-разрядной ветке реестра, но и в 32-разрядной.
А с учетом уже найденного решения? »
Stealthmax, я еще понимаю строки/числа из реестра читать и выводить в удобной форме, но бинарные данные зачем?
// читать
RegQueryBinaryValue(HKLM, 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes', RegKey10);
// сравнить
MsgBox(Format('%d', [(RegKey10 = #$70#$01#$00#$20)]), mbInformation, MB_OK);
// записать
RegWriteBinaryValue(HKLM, 'SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes', #$70#$01#$00#$20);
Stealthmax
08-09-2015, 17:11
я еще понимаю строки/числа из реестра читать и выводить в удобной форме, но бинарные данные зачем? »
Возникла проблема, когда в ключе потребовалось изменить туда/обратно значение, в частности, данный CLSID - это корзина, т.е. все что требовалось, это изменить "Attributes"=hex:40,01,00,20 на "Attributes"=hex:70,01,00,20. Говоря проще, скрыть или показать корзину в переходах Проводника Windows(и по аналогии другие элементы, но там проще получилось с Dword).
может оказаться, что на 64-разрядной системе CLSID находится не только в 64-разрядной ветке реестра, но и в 32-разрядной »
В точку. В примере, я не указывал ключ RegWriteBinaryValue(GetHKLM(), 'SOFTWARE\Wow6432Node\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder', 'Attributes', RegKey11);
Поэтому и пояснил этот момент, в плане того, что учел эту особенность и проверил работоспособность именно на x64, где есть Wow6432Node.
El Sanchez
09-09-2015, 09:09
Wow6432Node »
Stealthmax, это тоже ошибка. Нельзя прямо указывать Wow6432Node. Категорически.
может оказаться, что на 64-разрядной системе CLSID находится не только в 64-разрядной ветке реестра, но и в 32-разрядной. »
Stealthmax, я про то, что данный CLSID находится в 2-х местах, с помощью GetHKLM на 64-разрядной системе запись будет произведена только в 64-разрядную ветку реестра. Всего-то нужно на 64-разрядной системе для данного CLSID RegWriteBinaryValue вызвать 2 раза: RegWriteBinaryValue(HKLM, 'SOFTWARE\Classes\...') - запись пойдет в 32-разрядную ветку, RegWriteBinaryValue(HKLM64, 'SOFTWARE\Classes\...') - запись пойдет в 64-разрядную ветку.
Stealthmax
09-09-2015, 21:05
Всего-то нужно на 64-разрядной системе для данного CLSID RegWriteBinaryValue вызвать 2 »
Т.е. в случае, если запуск будет выполнен на 32-разрядной ОСи, то отработает ключ, RegWriteBinaryValue(HKLM, 'SOFTWARE\Classes\...') » а HKLM64 будет пропущен ввиду отсутствия, верно?
Stealthmax,
HKLM64
Этот ключ предназначен исключительно для 64 битной системы.
Без ключа 64,т.е. HKLM, запись будет происходить в секцию Wow6432Node, в 32-разрядную ветку. А при наличии ключа, т.е. HKLM64, запись будет идти в верхний раздел реестра, до секции Wow6432Node, в 64-разрядную ветку. Этот ключ типа переключателя. Бывает очень даже нужен, в некоторых случаях.
На 32 битной системе, при установке, сразу выдаст ошибку.
Ставьте запрет, установка только, if IsWin64 then и все.
audiofeel
10-09-2015, 03:40
почему текст при нажатии "обводится" пунктиром каким то ? в скрипте только VclStylesinno, ни чего нет, чек бокс не через ботву
Stealthmax
10-09-2015, 08:32
TryRooM, El Sanchez, спасибо, теперь порядок, пойду дальше "пилить". Убрал срам RegWriteDWordValue(GetHKLM(), 'SOFTWARE\Wow6432Node\Classes\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder','Attributes', $b0940064);
audiofeel
10-09-2015, 22:41
как сделать TMemo со списком копирующихся файлов в ISDone?
пример нашел, но на этом все, ни чего не понял
http://krinkels.org/threads/faq-po-inno-setup.7/#post-42
еще вопрос. как сделать быстрый выбор диска установки. его буквы, как на скрине ??
http://krinkels.org/attachments/snimok-ehkrana-2-png.2465/
и еще вопрос как реализовать прозрачность появляющуюся при перемещении окна , а также "медленный" выход(исчезновение) как на видео ?
пример (https://youtu.be/ByXRqw1x6TQ)
vadjliss
12-09-2015, 17:31
подскажите как сделать интеграцию в меню по запросу
почему текст при нажатии "обводится" пунктиром каким то? »
Решил вопрос с этим, а то меня тоже интересует данный факт.
audiofeel
13-09-2015, 00:57
Решил вопрос с этим, а то меня тоже интересует данный факт. »
нет, видимо особенность VclStylesinno, сделал отдельно чек боксы и отдельно лейблы
AlekseyPopovv
13-09-2015, 13:53
Как правильно задать параметр?
Exec(ExpandConstant('{win}\regedit.exe'), '/EA (ExpandConstant({commondesktop}\settings.reg HKEY_CURRENT_USER\Software\DWGTool\CADConverter)', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.