DLLを動的に呼び出すには?

解決


たかのん  2014-12-02 05:01:23  No: 46899  IP: [192.*.*.*]

Windows8.1 64bit、DephiXE7で動的にDLLを呼び出すプログラムを作っています。
LoadLibrary()でDLLのハンドルを取得することはうまくいっているようなのですが、
GetProcAddress()で関数を呼び出す所で0が返ってきてDLLが動作しません。
0が返ってくる原因としては何が考えられますでしょうか?
DLLはプログラムと同じディレクトリに置いています。

編集    削除
igy  2014-12-02 06:11:14  No: 46900  IP: [192.*.*.*]

あまり詳しくないのですが、
GetLastError関数
で、エラーコードを取得してみるのは、いかがですか?

編集    削除
通りすがり  2014-12-02 06:33:32  No: 46901  IP: [192.*.*.*]

LoadLibraryが成功しているのであれば、DLLそのものは正常に読み込めているはずです。
一方でGetProcAddressに失敗しているということは、基本的にはその名前の関数がDLLにない、ということになります。
(あとはGetProcAddressに成功しているのに、呼び出すとみたこともないようなエラーになる、というパターンで、
これは引数の個数と型が一致していないか、呼び出し規約が一致していないことによります)

ということで、まずはTDump(Delphiのインストール先のbinの中にあります)か、Dependency Walker 
http://www.dependencywalker.com/ でDLLがエクスポートしている関数の名前から確認してみては
いかがでしょう。

編集    削除
774  2014-12-02 23:18:45  No: 46902  IP: [192.*.*.*]

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で確認出来ます。

編集    削除
たかのん  2014-12-03 00:25:23  No: 46903  IP: [192.*.*.*]

igy様、通りすがり様、774様、DLL呼び出し原因の究明方法のアドバイスありがとうございます。
GetLastError関数で確認した所、127が返ってきていました。
Dependency Walkerを使用して関数名を確認した所、呼び出し側と実際の関数名で
大文字小文字が違っていました。
別のDLLに対してDependency Walkerで見たところ、774様が書かれている
エクスポート名が期待している名前というものもありました。
これからは、DLLからエクスポートされている関数名と呼び出し側の関数名が
合っているかをしっかり確認していきたいと思います。
ありがとうございました。

編集    削除