Я использую сценарий Inno Setup для установки 32- и 64-разрядных библиотек DLL в 64-разрядной версии. Я могу получить 64-битный путь из настроек реестра, но 32-битный путь отсутствует, не существует. Однако я знаю, что «хвост» пути постоянен, нужно изменить только голову. Т.е.,
64-bit (from registry) = c:\Program Files\My Application\Bin
32-bit (derived) = c:\Program Files (x86)\My Application\Bin
Итак, что я делаю, это меняю путь к файлу 64-битной программы на 32-битный. Я легко делаю это с помощью StringChangeEx:
RegQueryStringValue(HKLM, 'SOFTWARE\My Application', 'RootDir', sPath)
if IsWin64() then
StringChangeEx(sPath, ExpandConstant('{pf}'), ExpandConstant('{pf32}'), False);
SPath возвращается с моим 32-битным путем. Это отлично работает в большинстве систем, но кажется, что иногда StringChangeEx не меняет «C: \ Program Files» на «C: \ Program Files (x86)». Я подтвердил (используя MsgBox), что константы {pf} и {pf32} - это то, что я думаю. Регистр такой же, нет начальных / конечных пробелов. Просто кажется, что в некоторых системах функция не работает.
Я использую последнюю версию InnoSetup (10/2010). На сайте не упоминается о каких-либо проблемах с этой функцией. Кто-нибудь еще видел это и / или есть идеи о том, что это может быть?
2 ответа
Оказывается, в записи реестра иногда была строчная буква диска. Я изменил код на:
RegQueryStringValue(HKLM, 'SOFTWARE\My Application', 'RootDir', sPath)
sPath := Lowercase(sPath);
if IsWin64() then
StringChangeEx(sPath, Lowercase(ExpandConstant('{pf}')), Lowercase(ExpandConstant('{pf32}')), False)
Я предполагал, что проблема не в записи реестра, но не совсем так.
Я собрал этот небольшой скрипт и, используя 5.4.0 (выпуск от 10/2010), он работал:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{AE1A6BBB-7582-43AA-85F5-C7F984D1A68B}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Code]
function InitializeSetup(): Boolean;
var
sPath : string;
begin
sPath := ExpandConstant('{pf}') + '\mypath';
if IsWin64() then
StringChangeEx(sPath, ExpandConstant('{pf}'), ExpandConstant('{pf32}'), False);
MsgBox(sPath, mbInformation, MB_OK);
result := true;
end;
Мой сценарий работает или не работает?
Правильно ли sPath перед вызовом StringChangeEx?
Я бы предложил параметр / LOG, но код не регистрируется автоматически. Вам нужно будет добавить вызовы Log (const S: String).
Похожие вопросы
Новые вопросы
inno-setup
Inno Setup - это инструмент для создания программ установки со встроенным языком сценариев, основанным на Pascal.