Войти

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

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

Respin
24-10-2012, 07:04
можно ли импортировать функции 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