2013-07-30 2 views
8

Если ОС 64 бит, я хочу установить 32-разрядную DLL в папку Program Files (x86) и 64-битную DLL в папку Program Files и зарегистрировать их соответственно. Если это 32-разрядная ОС, я просто хочу скопировать файл в обычную папку программы и зарегистрироваться.Inno Setup 32bit и 64bit dll installation

Как это сделать в Inno Setup? Также будет ли 64-битная DLL зарегистрирована в 64-битной программе regsvr32?

Вот мой код. Он отлично работает на 32-битной ОС, но на 64-битной ОС он выгружает оба набора файлов в Program Files (x86).

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 32bit 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 

Я посмотрел на 64BitTwoArch.iss пример, но что говорит, как сделать 32bit или 64bit установить не 32bit и 64bit установки.

+3

Если вы хотите, чтобы оба файла были установлены на 64-битной Windows, а папка назначения была различной для каждого, вы не можете использовать тот же «DestDir» для обоих. Существует не «хорошее» решение для их установки в разных папках, потому что на самом деле это не то, что вы должны делать (и вы не можете гарантировать, что {app} находится под {pf} в любом случае). Лучшее решение - либо установить только один файл, соответствующий ОС, либо установить их в одной папке с разными именами файлов. – Miral

+0

Я второй, что @Miral говорит. Вы можете сделать это, используя кучу уродливых строковых операций в {app}, но нет гарантии, что пользователь установит его в {pf} в первую очередь. – Nyerguds

ответ

2

не мог заставить его работать только с переменной {app}, потому что вы хотите установить на двух направлений одновременно.

решаемые его жесткого кодирования программных файлов папки, как этот

#define MyAppName "TestAPP" 

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {pf32}\{#MyAppName}; \ 
    Flags: restartreplace ignoreversion regserver 32bit 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {pf64}\{#MyAppName}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 

Это работает для меня. Windows загружает 32-разрядную DLL для 32-разрядных приложений и 64-разрядную DLL для 64-битных приложений автоматически.

+0

Я получаю сообщение об ошибке: «Не удалось зарегистрировать DLL/OCX: RegSvr32 с кодом выхода 0x4» при запуске вышеуказанного скрипта. Я предполагаю, что моя x64 Windows не справляется с включением регистрации x86. Есть ли способ справиться с этим? – Chagbert

+0

Это похоже на проблему с регистрацией компонента, а не с копированием файлов.Попробуйте запустить regsvr32 и компонент самостоятельно и увидеть проблему. Убедитесь, что вы используете 32-битный regsvr32, если это 32-разрядная DLL. По умолчанию он может использовать 64-битный regsvr32. Также убедитесь, что установщик имеет правильную привилегию администратора. https://support.microsoft.com/en-us/kb/282747 – Ali

+0

Хотя это и делает то, о чем спрашивает вопрос, как правило, правильным решением является [ответ by @ GAR8] (http://stackoverflow.com/a/ 17949964/850848). Вы не хотите устанавливать одну одиночную 64-разрядную DLL в 64-разрядные «Program Files». Вы сохраняете его с остальными двоичными файлами для вашего (предположительно) 32-битного приложения. –

4

Я имел успех со следующим:

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 32bit; **Check: "not IsWin64"** 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 
+0

destdir - {app} для обоих. Разве он не скопировал бы и 64 и 32 бит в то же место? Я хотел бы, чтобы 64-битная копия была скопирована в 64-битные файлы программных файлов и 32-битная для файлов программ x86. – Ali

+0

Нет, он копирует только версию, соответствующую бит системы. Per Inno Help: «Заставляет константу {sys] сопоставлять с 64-битным системным каталогом при использовании в параметрах Filename и WorkingDir. Это поведение по умолчанию в установке с 64-битным режимом. Этот флаг может использоваться только тогда, когда Установка выполняется на 64-разрядной Windows, в противном случае возникает ошибка. При установке, поддерживающей как 32-, так и 64-разрядную архитектуры, можно избежать ошибки, добавив параметр Check: IsWin64, который приведет к тому, что запись будет тихо пропустили при работе на 32-битной Windows ». – GAR8

+0

Это не отвечает на вопрос, поскольку он действительно устанавливает оба файла в одно и то же место ('{app}' разрешает папку установки, выбранную пользователем, она не будет волшебным образом отображать 64-битный эквивалент, если флаг '64bit' равен используемый). С другой стороны, это правильное решение для большинства случаев. Например, если ваше приложение является 32-разрядным, но также имеет расширение оболочки 64-разрядной версии, вы все равно устанавливаете расширение оболочки вместе с остальными двоичными файлами в 32-разрядные «Program Files». Но вы используете флаг '64bit', чтобы он регистрировался для 64-битного. –

Смежные вопросы