Войти

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


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

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 будет пропущен ввиду отсутствия, верно?

TryRooM
10-09-2015, 01:01
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
подскажите как сделать интеграцию в меню по запросу

Respin
13-09-2015, 00:50
почему текст при нажатии "обводится" пунктиром каким то? »
Решил вопрос с этим, а то меня тоже интересует данный факт.

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