2013-07-30 34 views
8

OSが64bitの場合は、Program Files (x86)フォルダに32bit DLLをインストールし、Program Filesフォルダに64b​​it DLLをインストールしてそれぞれ登録したいと思います。 32ビットOSの場合は、ファイルを通常のプログラムフォルダにコピーして登録したいだけです。Inno Setup 32bitと64bit dllのインストール

どうすればInno Setupで行うことができますか?また、64bit DLLは64bit regsvr32プログラムによって登録されますか?

ここまでは私のコードです。それは32ビットOS上でうまく動作しますが、64ビットOSでは、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例を見てきましたが、それはない32ビットと64ビットのインストールインストール32ビットまたは64ビットを行う方法について説明します。

+3

両方のファイルを64ビット版Windowsにインストールし、インストール先フォルダをそれぞれ異なるようにするには、両方に同じDestDirを使用することはできません。実際にあなたがするべきことではない(とにかく{app}はとにかく{pf}の下にあることを保証することはできません)ので、それらを異なるフォルダにインストールするための "良い"解決策はありません。最適な解決策は、OSと一致する1つのファイルのみをインストールするか、または両方を同じフォルダに異なるファイル名でインストールすることです。 – 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ビットのアプリケーション用の32ビットDLLと、64ビット用の64ビットDLLをこのように自動的にロードします。

+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

これは質問が尋ねることを行いますが、一般的に正しい答えは[@ GAR8による回答]です(http://stackoverflow.com/a/ 17949964/850848)。 64ビットの「プログラムファイル」に64ビットのDLLを1つインストールする必要はありません。あなたは(おそらく)あなたの32ビットアプリケーション用の残りのバイナリと一緒に保存します。 –

4

私は次のようで成功を収めている:あなたは同時に2つの宛先にインストールするため

[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ビットのプログラムファイルの場所にコピーし、32ビットをx86のプログラムファイルにコピーしたいと思います。 – Ali

+0

いいえ、システムのビットと一致するバージョンのみをコピーします。 Per Inno Help: "ファイル名と作業ディレクトリのパラメータで使用されたときに{sys}定数が64ビットシステムディレクトリにマップされます。これは64ビットモードインストールでのデフォルト動作です このフラグは、 32ビットと64ビットの両方のアーキテクチャをサポートするインストールでは、Check:IsWin64パラメータを追加することでエラーを回避することができます。 32ビットWindows上で動作するときに静かにスキップされます。 – GAR8

+0

これは本当に両方のファイルを同じ場所にインストールするので( '{app}'はユーザーが選択したインストールフォルダに解決されます)、 '64bit'フラグが魔法のように64ビットに対応するわけではありません中古)。一方、ほとんどの場合、これは正しい解決策です。たとえば、アプリケーションが32ビットで、64ビットバージョンのシェル拡張がある場合でも、残りのバイナリと一緒にシェル拡張を32ビットの "Program Files"にインストールします。しかし、64ビットに登録するには '64bit'フラグを使います。 –

関連する問題