![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Помогите с IS установкой!
Мне нужно считать путь в реестре HKLM\Software\VST\VSTPluginsPath="путь" и установить в него сабж в тихом режиме. Ниодной подходящей функции не нашёл - GetEnv, GetIniBool, GetSystemDir... |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
А что секция [Registry] разве не обрабатывается во время Silent Install?
-------------------- |
|||
|
||||
| Insert |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 13.4.2006 Репутация: нет Всего: 1 |
RegQueryStringValue - считывает нужное тебе значение в переменную, а потом в секции [Files] пишешь:
DestDir: {code:getpath|''} где getpath функция возвращающая это значение --------------------
пьяный русский кодер практически непобедим |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Insert, а можно всю процедуру подробно написать тут? Ато не разберусь, хотя и буду пытаться :(
Мне ещё вот что подсказали, возможно и подойдёт для мну тоже:
Но конечно чем больше информации тем лучше Приходится изучать паскаль налету, на глубокое изучения меня не хватает... А без Pascal в Inno тоже туго Это сообщение отредактировал(а) semiono - 31.12.2007, 19:29 |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
semiono, тебе подсказали очень не плохой вариант!
В секции [Files] в строке типа Source: "MYPROG.EXE"; DestDir: "{app}" можно использовать различные константы (здесь, например, использована {app} - папка, в которую пользователь захотел установить прогу). Есть среди них (оказывается Добавлено через 13 минут и 28 секунд Ну а ежели б такой константы не было, пришлось бы создать свою (scripted constant). В отличие от обычных констант они обозначаются с использованием слова code. Синтаксис объявления такой константы следующий: {code:FunctionName|Param} где: FunctionName – имя вызываемой функции; Param – строковый параметр, который передается вызываемой функции. Если он будет опущен, вызываемой функции будет передана пустая строка; Итак, в секции [Files] пишешь: Source: "file.exe"; DestDir: "{code:MyConst}" А в секции [Code] опишем функцию MyConst: function MyConst: String; begin RegQueryStringValue(HKLM, 'Software\VST\', 'VSTPluginsPath', Result); end; Видимо, Insert имел ввиду нечто подобное. -------------------- |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Видимо я добрался до самого страшного :\
Нужно указать путь во внешнем файле после установки. Боюсь, что IS этого вообще не может. Скажем после инсталла имеем C:\zzz\Preference.xml ************************************ <?xml version="1.0" standalone="yes" ?> <ArtsAcousticReverbPreference Version="1"> <UserPath>???</UserPath> <PresetPath>???</PresetPath> </ArtsAcousticReverbPreference> ************************************* В котором нужно вписать UserPath и PresetPath И ещё хотелось бы управлять бездиалоговым инсталлером файлом извне, напр. C:\MyProg.exe - при установке изменяет путь {app} на тот который указан в C:\FILE.txt или INI какойнибуть... 0_o |
|||
|
||||
| kemiisto |
|
||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Вот так например можно отредактировать твой xml. В конце концов - это обычный набор строк!
Добавлено через 1 минуту и 48 секунд А вот дальше я чего-то не понял!
Чуть поподробнее опиши, будь добр! -------------------- |
||||||
|
|||||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Невероятно! 0_o
Работает! Но почему я когда хелп читаю нифига там не нахожу. Впринцыпе моя проблемма, это ж сначала гуру надо быть в паскале! kemiisto с вторым вопросом всё просто, это тоже что и с реестром было [Files] Source: "file.exe"; DestDir: "{reg:HKLM\Software\VST,VSTPluginsPath|DefaultValue}" только в этом случае нужно реестр заменить на файл какогонибудь типа (txt/ini/xml/bat) лучше конечно ini или просто безформатный текст-файл без расширения Смысл таков. Я не хочу включать диалоги в инсталлер вообще никакие. Но иногда может оказаться что нужно изменить путь установки. Поэтому для аварийного случая инсталлер должен иметь строку "аварийной-запасной установки" которую он сможет считать из руководящего внешнего файлика. Типа написал текст-инструкцию, положил рядом с инсталлером и он последовал этой Unattended-установки. |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Инструкцию я бы оформил в виде ini-файла. А потом при инициализации инсталляции считывал бы нужные значения.
Вот пример: Присоединённый файл ( Кол-во скачиваний: 8 )
semiono.rar 3,96 Kb-------------------- |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Я только скачал, а вот здесь
Source: "MyDll.dll"; DestDir: {code:ReadPath} можно наверное DestDir: {code:ReadPath|Default} как и ранее использовать?... По ходу дела там ещё возникло, когда XML правил... а нельзя пробел вписывать? Ибо в XML красивее так было <ArtsAcousticReverbPreference Version="1"> пробел<UserPath>???</UserPath> пробел<PresetPath>???</PresetPath> вернее здесь даже Tab-отступы offtop: Собсно мы тут подошли к вопросу о том, как букву в "дампе" текста изменить ))) мало пригодно, но всёж интересно теоретически? [S:n] - это стринги я так понял, а как тогда Rows указать? kemiisto, спасибо тебе! Насчёт INI это верно, я вообще любитель INF/INI, XML - это более модно... Надо мне будет поиграться потом с функциями чтоб закрепить материал... Я чё-то такой влюблённый стал в InnoSetup, ранее всё мечтал освоить какойнить "язык", оказалось что IS самый любимый IDE стал для мну! С одной стороны практически полезный, с другой, действительно возможности при таком маленьком пакете просто поражают! Это сообщение отредактировал(а) semiono - 7.1.2008, 02:53 |
|||
|
||||
| kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
По поводу отступов в XML. Теоретически я бы так вот написал:
Но почему то не работает
Вот так вот! P.S. Я в XML не очень то разбираюсь, возможно ошибся! Добавлено через 2 минуты и 2 секунды В первом образце кода вместо пробела стоит но html переформатировал! Ща еще ращок попробую S[2] := ' <UserPath>' + 'something' + '</UserPath>'; S[3] := ' <PresetPath>' + 'something' + '</PresetPath>'; Добавлено через 3 минуты и 25 секунд Вот блин, незадача! Тогда вот так: Присоединённый файл ( Кол-во скачиваний: 10 )
setup.iss 1,35 Kb-------------------- |
||||
|
|||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Кстати да. Хоче только сделать небольшое дополнение: что не может Inno своими штатными средствами (такого мало, но все же есть) он может с помощью библиотек. Т.е. пишем библиотеку (dll) на любом языке (Delphi, C++ и т.п.), потом в [code] подключаем библиотеку и используем в ней нужную функцию.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| semiono |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Нужно создать "новый" файл
{sys}\nuendo.cmd и вписать в него
где {app} переменная в InnoSetup! ~ Что то опыт со стрингами, что раньше было мне не помог. Вопервых, не знаю как пустой файл создать... Хотя если положить файлик и наполнить строками, то LoadStringsFromFile(F, S); итд. можно. Но ведь хочется упростить, чтоб было разумно. И моя старая фитча тут тоже не прокатила видимо из-за каких-то спец.-слов/символов [Run] Filename: "{tmp}\system.cmd"; Parameters: "{app}" Батник:
? Вообще-то проблемма только в том как создать файл. Я полазил по хелпу и походу там нету CreateFile MakeFile или ещё чего. Хотя в Паскале наверняка есть. Это сообщение отредактировал(а) semiono - 4.2.2008, 00:16 |
||||
|
|||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Ну вот так, например:
-------------------- |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Возвращаясь к пройденному
Но нельзяль иметь дело c не INI файлом, а вот так {src}\file (8.1 - без расширения) в ктором юзер может сам написать по желанию: путь сразу без всяких секций сразу с первой строки? ( Просто как S[0] := ) --------------- [file] E:\Progra~1\zzz...\aaa ---------------EOF То-есть файл неопределённого типа, и без оформления... Типа считать нулевую строку из файла и всё! Дело в том что для этой цели ini-файл мне кажется избыточным, так как сама задача более примитивная. Хотя всё итак работает замечательно, просто хотелось бы решить проблемму более "красиво" ;) kemiisto, большое спасибо! PS. наверное из стандартных функций более удобно общатся с INI форматом, а то что я спросил видимо нужно уже кодить как-то более мудрённо... Но результат всёж лучше должен оказаться если считывать стрингс вместо секций... Хотя у меня не получилось самому собрать такую процедуру ) Напомню навсякий случай, что нужно из внешнего файла если он существует считать альтернативный путь установки. Это сообщение отредактировал(а) semiono - 6.2.2008, 00:55 |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Присоединённый файл ( Кол-во скачиваний: 7 )
semiono.rar 3,92 Kb-------------------- |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Я вроде ранше говорил, что файл 'setup' может не существовать.
... begin F := Dir + '\setup'; if not FileExists(F) then Exit; - не помагло! LoadStringsFromFile(F, S); Result := S[0]; end; видимо из за этого: function InitializeSetup(): Boolean; begin ... Я имел ввиду, то что в директории мы имеем некий "тихий" инсталлер setup.exe и всё. Но вот например, у юзера возникло желание изменить путь установки. И тогда пользователь сам создаёт в той же директории рядом с setup.exe файлик setup и вписывает туда свой путь. Изначально setup.exe один. это типа тайная фитча будет Это сообщение отредактировал(а) semiono - 6.2.2008, 15:00 |
|||
|
||||
| kemiisto |
|
||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
А поподробнее?
Если я правильно понял, то при отсутствии этого файлика, установка должна происходить в некую папку по умолчанию (например, C:\Program Files\Default VST\). Тогда так:
-------------------- |
||||||
|
|||||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Только у меня вопрос тогда
[Files] DefaultDirName={code:ReadPath|DefaultPath} ; может здесь тогда просто {app} [Files] DestDir: {code:ReadPath|DefaultPath}... ; или тут {app} или везде надо указать подробно {code:ReadPath|DefaultPath} ой, хотя я кажись понял, сам код уже выдаёт {code:ReadPath} что уже достаточно! Да, вроде так и есть! Я туплю ) |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Имеется, собрал! С Вашей помощью!
Я придумал теперь даже круче! Указательный файл должен лежать на системном диске. Чтобы была возможность инсталлировать с cdrom, ну и вообще так симпотишней [Setup] AppName=N__ndo AppVerName=N__ndo 2.2.0.39 DefaultDirName={code:GetPath} DirExistsWarning=no DisableDirPage=yes DisableProgramGroupPage=yes ArchitecturesInstallIn64BitMode=x64 Compression=lzma SolidCompression=yes OutputDir=D:\ OutputBaseFilename=N__ndo TouchDate=2001-01-01 TouchTime=00:00 MinVersion=4.1,4.0 VersionInfoCompany=S__iono VersionInfoCopyright=(С) 2001-2005 GmbH VersionInfoDescription=N__ndo VersionInfoTextVersion=2.2.0.39 VersionInfoVersion=2.2.0.39 Uninstallable=no UsePreviousAppDir=no SetupIconFile=.\patch\N__ndo.ico WizardImageFile=.\patch\N__ndo.bmp [Messages] BeveledLabel= ~ [code] var Dir: String; function GetPath(Param: String): String; var S: TArrayOfString; F: String; begin F := Dir + 'n__ndo'; if not FileExists(F) then Result := ExpandConstant('{pf}\N__ndo') else begin LoadStringsFromFile(F, S); Result := S[0]; end; end; function InitializeSetup(): Boolean; begin Dir := ExpandConstant('{sd}\'); Result := True; end; procedure DeinitializeSetup(); var S: TArrayOfString; F: String; begin F := ExpandConstant('{sys}\n__ndo.cmd'); // я заменил - F:= {sys}'n__ndo.cmd' интересно какой вар. лучше? SetArrayLength(S, 4); S[0] := '@if "%1"=="-h" start n__ndo.chm & goto nop'; S[1] := '@if "%1"=="-help" start n__ndo.chm & goto nop'; S[2] := '@start ' + ExpandConstant('{code:GetPath}') + '\N__ndo.exe %2'; S[3] := ':nop'; SaveStringsToFile(F, S, False); end; [Dirs] // ставим ro на папки, чтоб потом иконки работали через desktop.ini =) Name: "{code:GetPath}"; Attribs: readonly; Flags: uninsneveruninstall; Permissions: admins-full Name: "{reg:HKLM\Software\VST,VSTPluginsPath|{sys}\Plugins}"; Attribs: readonly; Flags: uninsneveruninstall; Permissions: admins-full [Icons] Name: "{userprograms}\N__ndo"; Filename: "{code:GetPath}\N__ndo.exe"; WorkingDir: "{code:GetPath}"; IconIndex: 0; Comment: "N__ndo" Name: "{userfavorites}\N__ndo"; Filename: "{code:GetPath}\N__ndo.exe"; WorkingDir: "{code:GetPath}"; IconIndex: 0; Comment: "N__ndo" Name: "{sendto}\N__ndo"; Filename: "{code:GetPath}\N__ndo.exe"; WorkingDir: "{code:GetPath}"; IconIndex: 0; Comment: "N__ndo" [Registry] ; Winlogon Root: HKLM; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\Winlogon"; ValueType: dword; ValueName: "SFCDisable"; ValueData: "$ffffff9d"; Flags: noerror; Permissions: admins-full Root: HKLM; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\Winlogon"; ValueType: dword; ValueName: "SfcQuota"; ValueData: "$00000000"; Flags: noerror; Permissions: admins-full Root: HKLM; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\Winlogon"; ValueType: dword; ValueName: "SFCScan"; ValueData: "$00000000"; Flags: noerror; Permissions: admins-full ; Computer Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\N__ndo"; ValueType: string; ValueName: ""; ValueData: "&N__ndo"; Flags: noerror; Permissions: admins-full Root: HKLM; Subkey: "Software\Classes\CLSID\{{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\N__ndo\command"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\N__ndo.exe"; Flags: noerror; Permissions: admins-full ; Run Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\N__ndo.exe"; ValueType: string; ValueName: ""; ValueData: "{code:GetPath}\N__ndo.exe"; Flags: noerror; Permissions: admins-full Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\N__ndo.exe"; ValueType: string; ValueName: "Path"; ValueData: "{code:GetPath}"; Flags: noerror; Permissions: admins-full ... Это сообщение отредактировал(а) semiono - 15.2.2008, 17:40 |
|||
|
||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
Ещё один подсказ нужен...
Как файл переименовать/удалить и т.д. Например, нужно установить HHCtrl.ocx свой патченный. ~install after rebout из Inno не пойдёт, потому-что на некоторых десктопах, скажем у меня нету explorer.exe А INNO видимо когда пытается shutdown запустить ищет его... Вообщем виснет - не перегружается! Я так думаю надо просто файлик переименовать и свой на его место положить. А тут кстати shell32.dll тоже заменить планируется... Я так думаю надо из инсталлера как-то сделать shell32.dll -> shell32.bak ??? Таких примеров много ещё, например, я даже не уверен как в WinRar RarExt.dll заменить, он даже не regserver установка! Но с WinRar это особый случай... Это сообщение отредактировал(а) semiono - 15.2.2008, 04:41 |
|||
|
||||
| kemiisto |
|
||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Это пожалуйста!
Удаляет файл FileName. Если файл не может быть удален или не существует, функция вернет False.
Пытается изменить имя файла или папки с OldFile на NewFile. Если удасться, вернет True. Елси не сможет переименовать (например, файл NewName уже существует), вернет False.
Копирует файл ExistingFile в NewFile, сохраняя отметку времени и аттрибуты. Если FailIfExists равно True и NewFile существует, ,то копирование не выполнится, иначе файл будет перезаписан. Возвращает True при успешном копировании, в противном случае - False .
Видимо, да. Нужно сделать что-то типа (пишу без путей и проверки успешности операций):
Тогда при следующей перезагрузки будет задействована модифицированная dll. -------------------- |
||||||||||
|
|||||||||||
| semiono |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 28.7.2007 Репутация: нет Всего: нет |
1. Нужно переименовать файл, или Exit если он не существует. C:\zzzz
2. Нужно удалить файл, или Exit если он не существует. C:\zzzz К сожалению я не справился ни с чем, так как я не понимаю что делать с функциями. Для меня то что возвращает функция, к сожалению пустой звук. Не доходит до меня "делфи" хоть задушится! Когда код написан, я его ещё могу прочесть, но сам сколько не пытался не получилось. :( Приходится опять выпрашивать готовый кусок скрипта. function DeleteFile(const FileName: string): Boolean; var F := ExpandConstant('C:\zzzz') : string begin Result := True end; Кстати всякие куски кода делфи с нета тоже не удаётся привинтить, так как InnoSetup не имеет всех возможностей языка... Но главное что меня убивает, это то что неужели никто не удалял никогда, не переименовывал ничего, уже час гуглю и какая-то скудная информация...! Чего только не было, лишь бы не это! Это сообщение отредактировал(а) semiono - 27.2.2008, 01:24 |
|||
|
||||
| kemiisto |
|
||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
semiono, извини, что долго не отвечал. Давненько я здесь не был....
Насколько я понял, ты немножко путаешь 2 вещи:
Если коротко, то в коде первых (который пишешь ТЫ) можно использовать вызовы вторых (они УЖЕ описаны). Например, если при завершении установки мне нужно удалить какой-то файл я должен написать следующее:
Этого в принципе достаточно, но здесь нет проверки на корректность удаления. С другой стороны DeleteFile - функция, она возвращает значение:
Удаляет файл FileName. Если файл не может быть удален или не существует, функция вернет False. С проверкой на корректность удаления будет что-то типа:
-------------------- |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |