Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
R.i.m.s.k.y.
20-10-2012, 13:25
ToBeLife, полный путь до файла, с расширением, кавычки не нужны, они добавляются в процедурах RD/RF
Johny777, не всегда работает встроенная функция удаления файлов и папок, поэтому я через комстроку сделал.
И копирование тоже делаю через комстроку, и добавление кавык тоже своими функциями а не встроенными тк работают они по настроению, а разбираться чего установщик выкаблучивается вломм.
function Add_Quotes(strng : String):String;
begin
Result := '"' + strng + '"';
end;
procedure copy1file(fromfile, tofile:string);
begin
Exec('cmd.exe', ' /c copy /Y /V /B ' + Add_Quotes(fromfile) + ' ' + Add_Quotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;
ToBeLife
20-10-2012, 13:29
R.i.m.s.k.y., путь до файла который необходимо удалить, может варьироваться.
или это не будет иметь значения?
**и всё равно ругается на на неизвесный параметр (в данном случае диск C)
R.i.m.s.k.y.
20-10-2012, 13:32
ToBeLife, конечно будет и это надо учитывать
El Sanchez
20-10-2012, 14:29
расскажи пожалуйста, поподробнее про ключи реестра в 64-х битных системах
К примеру три ключа
- HKLM\SOFTWARE\Wow6432Node
- HKLM64\SOFTWARE\
- HKLM\SOFTWARE\
к каким разрядностям относятся? не являются первый и третий ключи синонимами и если нет - в каких случаях юзается первый и последний? »
R.i.m.s.k.y., первый вариант не применяется. Inno Setup является 32-разрядным приложением, поэтому по умолчанию запись в реестр производится в 32-разрядный куст. Для доступа к 64-разрядным кустам реестра необходимо указывать префикс 64 (64-разрядный режим работы инсталлятора ОТКЛЮЧЕН (по умолчанию)). При включенном 64-разрядном режиме (ArchitecturesInstallIn64BitMode=x64 ia64) умолчальным кустом будет являться 64-разрядный куст, доступ к 32-разрядному кусту по префиксу 32.
;64-разрядный режим работы инсталлятора ОТКЛЮЧЕН (по умолчанию)
HKLM\SOFTWARE\MyProgram - запись в 32-разрядный куст реестра, для 64-разрядных систем система сама произведет редирект в HKLM\SOFTWARE\Wow6432Node\MyProgram
HKLM64\SOFTWARE\MyProgram - запись в 64-разрядный куст реестра.
P.S. HKLM=HKLM32
;64-разрядный режим работы инсталлятора ВКЛЮЧЕН
HKLM\SOFTWARE\MyProgram - запись в 64-разрядный куст реестра.
HKLM32\SOFTWARE\MyProgram - запись в 32-разрядный куст реестра, редирект в HKLM\SOFTWARE\Wow6432Node\MyProgram
P.S. HKLM=HKLM64
Разумеется, все это с использованием функции IsWin64.
R.i.m.s.k.y.
20-10-2012, 17:54
El Sanchez, спасибо
такой вопрос:
1.при импортировании толстого файла реестра через reg import в какой куст реестра (32/64) он попадает? как правильно в 64битной ос занести 32/64 битный куст из reg-файла?
2. при использовании утилиты regshot она показывает что одинаковые записи заносятся в HKLM\SOFTWARE\Classes\Wow6432Node\ и HKLM\SOFTWARE\Wow6432Node\Classes\
Это чьи синонимы? Чтол это за кусты и как с ними бороться?
El Sanchez
20-10-2012, 19:27
при использовании утилиты regshot она показывает что одинаковые записи заносятся в HKLM\SOFTWARE\Classes\Wow6432Node\ и HKLM\SOFTWARE\Wow6432Node\Classes\
Это чьи синонимы? Чтол это за кусты и как с ними бороться? »
R.i.m.s.k.y., HKLM\SOFTWARE\Classes\Wow6432Node\ - 32-разрядный куст 64-разрядного куста HKLM\SOFTWARE\Classes, HKLM\SOFTWARE\Wow6432Node\Classes\ - 32-разрядный куст Classes 64-разрядного куста HKLM\SOFTWARE. Разница налицо.
при импортировании толстого файла реестра через reg import в какой куст реестра (32/64) он попадает? »
R.i.m.s.k.y., зависит от того какой (32- или 64-разрядный) reg.exe/regedit.exe будет вызван.
как правильно в 64битной ос занести 32/64 битный куст из reg-файла? »
R.i.m.s.k.y., пример reg-файла test.reg:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\123]
@="test"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\321]
@="test"
Как нужно:
[Run]
;запуск на 64-разрядной системе с помощью 64-разрядного regedit.exe
;не путать с 32-разрядной версией regedit.exe, находящегося в SysWOW64, указание {sys}\regedit.exe как раз этот случай
;флаг 64bit обязателен, без него записи из test.reg будут только в 32-разрядном кусте
Filename: {win}\regedit.exe; Parameters: "/S ""{src}\test.reg"""; Flags: 64bit; Check: IsWin64
;запуск на 64-разрядной системе с помощью 64-разрядного reg.exe
;флаг 64bit обязателен, без него будет вызвана 32-разрядная версия reg.exe
Filename: {sys}\reg.exe; Parameters: "import ""{src}\test.reg"""; Flags: runhidden 64bit; Check: IsWin64
Понятно, что не стоит применять reg-файл, сделанный на 64-разрядной системе, на 32-разрядной из-за наличия редиректа Wow6432Node в reg-файле.
CrashTest
22-10-2012, 20:54
Народ кому не сложно помогите. Нужно создать наипростейший инсталлятор на is. и с помощью его внести реестр, а при деинсталляции удалить его. Я изучаю nsis и не хочу заморачиваться с is. Просто мне нужно проверить один парадокс.
Ключи реестра нужно внести при инсталляции:
WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "version" "2.0.1"
Удалить:
DeleteRegKey HKCU "Software\Andrew Zhezherun"
El Sanchez
22-10-2012, 21:29
CrashTest,
[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test
[Registry]
Root: HKCU; Subkey: Software\Andrew Zhezherun; Flags: uninsdeletekey
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: language; ValueData: 1049
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: check-updates; ValueData: 0
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: warn-not-default-viewer; ValueData: 0
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: string; ValueName: version; ValueData: 2.0.1
CrashTest
22-10-2012, 21:53
El Sanchez, спасибо.
Volonter908
23-10-2012, 07:26
Доброго времени суток.
Обращаюсь к Вам,уважаемый господин El Sanchez и надеюсь на помощь.
Давно ищу скрипт для выбора имени пользователя и шары в установщике DC++(Речь идёт о файле DCPlusPlus.xml)
Имя,строка <Nick type="string">имя</Nick>
Шара,строка <Share>
</Share>
Несколько раз видел,как Вы помогали в похожей ситуации.Дело в том,что во всех таких случаях,кроме этих двух пунктов фигурировали ещё URL,временная папка для скачивания и тд(Пробовал убирать лишний функционал из тех примеров и потерпел неудачу.
Облазил уже всё что только можно.Please help.
El Sanchez
23-10-2012, 11:11
ищу скрипт для выбора имени пользователя и шары в установщике DC++(Речь идёт о файле DCPlusPlus.xml) »
Volonter908, дабы не тратить время на создание нод xml-файла через код, создайте шаблон файла DCPlusPlus.xml в кодировке UTF-8:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<DCPlusPlus>
<Settings>
<Nick></Nick>
</Settings>
<Share>
<Directory Virtual=""></Directory>
</Share>
</DCPlusPlus>
Тогда скрипт будет выглядеть вот так:
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[CustomMessages]
ru.NickNamePageCaption=Информация о пользователе
ru.NickNamePageDescription=Какой ник у Вас в DC++?
ru.NickNamePageSubcaption=Укажите ник и нажмите "Далее"
ru.NickNamePageEditName=Имя пользователя в DC++:
ru.ShareDirPageCaption=Выбор каталога для общего доступа
ru.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
ru.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа
[Files]
;допустим, что шаблон рядом со скриптом находится
Source: DCPlusPlus.xml; DestDir: {app}; Flags: ignoreversion
[Code]
var
NickNamePage: TInputQueryWizardPage;
ShareDirPage: TInputDirWizardPage;
//создание xml-файла
procedure CreateDCPlusPlus(Filename: String);
var
objXMLDoc: Variant;
begin
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
objXMLDoc.load(Filename);
//nick node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];
//share node
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];
//save xml
objXMLDoc.save(Filename);
except
//ShowExceptionMessage;
Exit;
end;
end;
//чтение значений из xml-файла при повторной установке
function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
objXMLDoc: Variant;
begin
Result := Default;
if not FileExists(Filename) then Exit;
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
objXMLDoc.load(Filename);
objXMLDoc.async := False;
if objXMLDoc.parseError.errorCode <> 0 then Exit;
Result := objXMLDoc.selectSingleNode(Node).text;
except
//ShowExceptionMessage;
Exit;
end;
end;
procedure CreateNickNamePage;
begin
NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', ExpandConstant('{username}'));
end;
procedure CreateShareDirPage;
begin
ShareDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
ShareDirPage.Add('');
ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;
procedure InitializeWizard();
begin
CreateNickNamePage;
CreateShareDirPage;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\DCPlusPlus.xml'));
end;
end;
R.i.m.s.k.y.
23-10-2012, 11:33
El Sanchez, спасибо, последний вопрос: в коде через exec как правильно вносить 32-х и 64-х битные ключи реестра в 64-й ОС?
El Sanchez
23-10-2012, 12:55
в коде через exec как правильно вносить 32-х и 64-х битные ключи реестра в 64-й ОС? »
R.i.m.s.k.y.,
var
OldState: Boolean;
ResultCode: Integer;
begin
if IsWin64 then
begin
OldState := EnableFsRedirection(False);
try
//через regedit.exe...
Exec(ExpandConstant('{win}\regedit.exe'), ExpandConstant('/S "{src}\test.reg"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
//...или reg.exe
Exec(ExpandConstant('{sys}\reg.exe'), ExpandConstant('import "{src}\test.reg"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
finally
EnableFsRedirection(OldState);
end;
end;
end;
R.i.m.s.k.y.
23-10-2012, 13:18
El Sanchez,
я окончательно запутался
а) для какого режима установщика (32/64) два вышеприведенных примера?
б) последний пример занесет файл реестра в 32-х или в 64-х разрядную секцию реестра?
El Sanchez
23-10-2012, 14:36
а) для какого режима установщика (32/64) два вышеприведенных примера? »
R.i.m.s.k.y., для режима по умолчанию. 64-режим нужен, если делаешь установщик 64-битной программы.
б) последний пример занесет файл реестра в 32-х или в 64-х разрядную секцию реестра? »
R.i.m.s.k.y., смотря что в reg-файле написано: HKEY_LOCAL_MACHINE\SOFTWARE\123 - пойдет в 64-разрядный куст, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\321 - 32-разрядный
R.i.m.s.k.y.
23-10-2012, 14:54
El Sanchez, я окончательно перестал понимать
Можно тебя об одолжении рассортировать все написанное по моим вопросам для ArchitecturesInstallIn64BitMode=x64 и ArchitecturesInstallIn64BitMode=(blank)
El Sanchez
23-10-2012, 17:40
R.i.m.s.k.y., ну тогда слушай теорию, повторять не буду. 64-битная система помимо нативных (родных, своих в доску, etc) 64-битных файлов имеет набор 32-битных файлов для поддержки запуска 32-битных программ через подсистему WOW64, не позволяющей обращаться 32-битному коду к 64-битным файлам и реестру. Грубо говоря, 64-битные программы работают с родными файлами из С:\Windows\system32 и родным реестром (напр. куст HKLM\SOFTWARE), а 32-битные со своим 32-битным набором из С:\Windows\SysWoW64 и своим 32-битным реестром в составе 64-битного (напр. куст HKLM\SOFTWARE\Wow6432Node). Программные группы тоже различаются: Program Files для 64-битных программ, Program Files (x86) для 32-битных. Inno, как и любое другое 32-битное приложение, при обращении к С:\Windows\system32 или к HKLM\SOFTWARE\MyProgram будет перенаправлено подсистемой WOW64 в соответстующие папку SysWoW64 и куст Wow6432Node, {sys} становится С:\Windows\SysWoW64, {pf} - C:\Program Files (x86), HKLM\SOFTWARE - HKLM\SOFTWARE\Wow6432Node и т.д. Если же установщик помимо 32-битных компонентов содержит 64-битные, то нужно позаботиться о том, чтобы неродные для 32-битной программы 64-битные файлы не попали куда не надо (флаг 64bit (для секций Files, Run и UninstallRun), функции IsWin64, EnableFsRedirection и т.д., префикс 64 для параметра Root секции Registry и т.д.).
[Run]
;64-bit mode OFF
Filename: {sys}\calc.exe; WorkingDir: {sys} - запустит калькулятор из С:\Windows\SysWoW64
Filename: {sys}\calc.exe; WorkingDir: {sys}; Flags: 64bit - запустит калькулятор из С:\Windows\system32
[Registry]
;64-bit mode OFF
Root: HKLM; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\Wow6432Node\MyProgram
Root: HKLM64; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\MyProgram
Теперь о директиве ArchitecturesInstallIn64BitMode. Установка ее значения в x64 и/или ia64 позволяет подсистеме WOW64 выполнять 32-битный код в 64-битном режиме путем переключения собственного режима процессора. Другими словами установщик не становится 64-битным приложением, это невозможно, просто теперь редирект не нужен, дефолтными стают теперь 64-битные папки и кусты, отпадает необходимость в указании флага 64bit или префикса 64, но появляется необходимость использования при обращении к 32-битным папкам и реестру флага 32bit, спецконстант типа {syswow64}, {pf32} и т.д., префикса 32. Поэтому включение режима целесообразно, если устанавливаемые компоненты сплошь 64-битные или их больше, чем 32-битных - меньше писанины. Т.к. 32-битных программ гораздо больше, чем "чистых" 64-битных, то на практике включение режима 64-bit mode встретишь нечасто. Лично я ни разу не применял.
[Run]
;64-bit mode ON
Filename: {sys}\calc.exe; WorkingDir: {sys} - запустит калькулятор из С:\Windows\system32
Filename: {sys}\calc.exe; WorkingDir: {sys}; Flags: 32bit - запустит калькулятор из С:\Windows\SysWoW64
Filename: {syswow64}\calc.exe; WorkingDir: {syswow64} - запустит калькулятор из С:\Windows\SysWoW64, не рекомендуется
[Registry]
;64-bit mode ON
Root: HKLM; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\MyProgram
Root: HKLM32; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\Wow6432Node\MyProgram
R.i.m.s.k.y.
23-10-2012, 18:36
El Sanchez, благодарю,
Твой пост будет очень полезен и другим, помести ссылку на него в шапку.
Johny777
24-10-2012, 01:16
добрые люди! :)
скажите пожалуйста
можно ли импортировать функции 7z.dll (лежит в папке архиватора) в Inno для распаковки (по возможности и запаковки) внешних архивов с отображением прогрессбара
если да то можно мне пожалуйста код?
кажись там даже можно юзать ком строку параметров (пропускать, перезаписывать ...)
просьба не предлагать мне IsDone
можно ли импортировать функции 7z.dll (лежит в папке архиватора) в Inno для распаковки (по возможности и запаковки) внешних архивов с отображением прогрессбара »
7.z-архивы (с отображением прогрессбара) можно распаковать через модуль распаковки FreeArc-архивов.
Есть ещё модуль для распаковки 7-zip архивов (с отображением прогрессбара).
Также где-то видел скрипт для запаковки в 7-zip архивы...
Вот тут (http://forum.ru-board.com/topic.cgi?forum=5&topic=36421&start=0&limit=1&m=4#1) посмотри (первое и второе там точно есть).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.