2011年5月22日日曜日

LoadLibrary 193 Error と 64bit環境で32bit DLLコンパイル方法

LoadLibraryでDLLをロードする際に「193」エラーコードが
返ってくる場合がある。

呼び出そうとしているDLLが確かに存在していおり
パスが通っているか、EXEがあるフォルダに置いたとしても
エラーが解決されない場合がある。
DLLの状態を確認するコマンドに「dumpbin /dependents hoge.dll」がある。

この原因は、そのDLLが64bit用にコンパイルされたもので
32bit環境で呼び出そうとした場合が考えられる。

であれば、DLLを32bit用に再コンパイルすれば解決する。

しかし、Windows7 64bit環境で、nmakeなどを使って32bit環境用に
コンパイルする際は、いくつか設定すべき項目がある。

今回は、64bitOSで32bit用のDLLを作成する手順である。

・Windows SDKのコマンドラインツール(CMD Shell)の設定
以下のコマンドを実行
SetEnv /x86 /xp
実行すると、ウインドウタイトルが「x86」に変わる

・メイクファイルの「LDFLAGS」の項目に以下を追加
-MACHINE:X86

参考までに、上記2点の統一が取れていないと以下のエラー表示
「fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'」

・そしてDLLの出力先ディレクトをx86用のパスに設定
これは、何を意味しているかというと、
64bit用は、「Program Files」配下に作成されるのをご存じだろう。
今回の出力先は、「Program Files」配下ではエラーになる。
例えばCドライブ直下にbinフォルダを作成し、そこを出力されるよう
メイクファイルを書き直す(例:DIR_BIN=C:\bin)

参考までに、ここが間違っていると以下のエラーが表示される
「fatal error C1905: Front end and back end not compatible (must target same processor).」

上記の手順を行った後、DLLを再コンパイルし、LoadLibraryを実行してみてほしい。
すんなり通ったのではないだろうか?

ちなみに、  LoadLibraryがもう少し分かりやすいエラーを返してほしいものである。

0 件のコメント:

コメントを投稿