Windows8.1 64bit、DephiXE7で動的にDLLを呼び出すプログラムを作っています。
LoadLibrary()でDLLのハンドルを取得することはうまくいっているようなのですが、
GetProcAddress()で関数を呼び出す所で0が返ってきてDLLが動作しません。
0が返ってくる原因としては何が考えられますでしょうか?
DLLはプログラムと同じディレクトリに置いています。
あまり詳しくないのですが、
GetLastError関数
で、エラーコードを取得してみるのは、いかがですか?
LoadLibraryが成功しているのであれば、DLLそのものは正常に読み込めているはずです。
一方でGetProcAddressに失敗しているということは、基本的にはその名前の関数がDLLにない、ということになります。
(あとはGetProcAddressに成功しているのに、呼び出すとみたこともないようなエラーになる、というパターンで、
これは引数の個数と型が一致していないか、呼び出し規約が一致していないことによります)
ということで、まずはTDump(Delphiのインストール先のbinの中にあります)か、Dependency Walker
http://www.dependencywalker.com/ でDLLがエクスポートしている関数の名前から確認してみては
いかがでしょう。
GetProcAddress()はUnicode対応していないので、いわゆるANSIの文字列で関数名を指定する必要があります。
http://docwiki.embarcadero.com/RADStudio/XE7/ja/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92_Unicode_%E5%AF%BE%E5%BF%9C%E3%81%AB%E3%81%99%E3%82%8B#GetProcAddress_.E3.81.AE.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97
可能性は低いですが、DLLからのエクスポート名が期待している名前と違っている可能性もあります。
Funcのつもりが実際は_Funcだったり、Func@4だったりといった具合ですが、
これについては一つ前のレスのTDUMPかDependency Walkerで確認出来ます。
igy様、通りすがり様、774様、DLL呼び出し原因の究明方法のアドバイスありがとうございます。
GetLastError関数で確認した所、127が返ってきていました。
Dependency Walkerを使用して関数名を確認した所、呼び出し側と実際の関数名で
大文字小文字が違っていました。
別のDLLに対してDependency Walkerで見たところ、774様が書かれている
エクスポート名が期待している名前というものもありました。
これからは、DLLからエクスポートされている関数名と呼び出し側の関数名が
合っているかをしっかり確認していきたいと思います。
ありがとうございました。
ツイート | ![]() |