2011-01-25 2 views
0

Я использую скрипт Inno Setup для установки 32-разрядных и 64-разрядных DLL-файлов в 64-разрядной версии. Я могу получить 64-битный путь из реестра, но 32-битный путь отсутствует, не существует. Тем не менее, я знаю, что «хвост» пути является постоянным, просто нужно изменить голову. Т.е.,Inno Setup StringChangeEx Failure

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). На веб-сайте не упоминаются проблемы с этой функцией. Кто-нибудь еще видел это и/или имел какие-либо идеи о том, что это может быть?

ответ

0

Оказывается, что запись в реестре иногда имела буквенное обозначение в нижнем регистре. Я изменил код на:

RegQueryStringValue(HKLM, 'SOFTWARE\My Application', 'RootDir', sPath) 
sPath := Lowercase(sPath); 
if IsWin64() then 
    StringChangeEx(sPath, Lowercase(ExpandConstant('{pf}')), Lowercase(ExpandConstant('{pf32}')), False) 

Я предположил, что запись в реестре не была проблемой, но не совсем так.

+0

Примите этот ответ, если он решит вашу проблему. – Bernard

1

я бросил вместе этот небольшой сценарий и используя 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).

+0

Проблема оказалась в том, что реестр не был обставлен точно так же, как {pf}. Таким образом, несколько вызовов в нижнем регистре() сделали трюк. Опция/log помогла мне раньше, так как она привела меня к этому разделу кода. Однако, возможно, действительно использовал какой-то Inno-отладчик. –