x64 をターゲットとしたセットアッププロジェクトで、x64 の DLL の関数を呼び出すカスタム動作を追加すると、ビルド時に
警告: エントリ ポイント ‘ICInstallSelf’ がカスタム動作 ‘ICInstallSelf’ のモジュール ‘c:\Documents and Settings\umezawa\My Documents\Visual Studio 2005\Projects\utvideo\x64\release\utvideo.dll’ で見つかりません。
みたいなことを言われ、出来上がった msi ファイルでインストールしようとすると関数を呼べなくてエラーになります。
MSDN の記事を見ると ORCA (msi ファイルの中身を直接いじることができるエディタ)を使って呼び出す関数の名前を書き変えろ、みたいなことが書いてあります。試しに msi ファイルの中をのぞいてみると、x86 をターゲットとしたものと x64 をターゲットとしたものとでこの部分に差異はないのですが、何故か呼び出せないようです。
ビルドするたびに ORCA を起動して書きかえればいいのですが、手で毎回修正するのは面倒ですし、書きかえるのを忘れるかもしれませんし、書き換えをミスるかもしれません。
というわけで、DLL をビルドするときに何とかすることを考えていました。最初はモジュール定義ファイル (.def) を書き変えたり __stdcall などを付けたりして苦戦してましたが、最終的にはリンカオプションに
/export:_ICInstallSelf@4=?ICInstallSelf@@YAHK@Z
を追加することで解決。この場合、モジュール定義ファイルには ICInstallSelf に関しては記述しないことになりますが、x86 バージョンの方のリンカオプションでも同様の記述をすることで、同じモジュール定義ファイルを使っていても問題なくインストーラをビルドできるようになります。
ただ、上の方法を使っても、相変わらずインストーラのビルド時に警告が出るんですけどね…(インストールは正常にできる)
no comment untill now