これが私のコードです。それを行うのは簡単なようですが、どういうわけかそれはうまくいきません。関数の最後の呼び出しは常にアクセスエラーで失敗します。
extern "C"
{
typedef const char* (*Init_fptr_t)();
HMODULE CMolNet::LoadDLL()
{
string dir = "C:\\MyDllDir\\";
CA2W dirw( dir.c_str() );
SetDllDirectory(dirw);
string dllfile = CombinePath(dir.c_str(), "mydll.dll");
CA2W dllfilew( dllfile.c_str() );
mDLL = LoadLibraryEx(dllfilew,0,LOAD_WITH_ALTERED_SEARCH_PATH);
DWORD err = GetLastError();
Init_fptr_t iFunc = (Init_fptr_t)GetProcAddress(mDLL,"Init");
const char *res = (*iFunc)();
}
}
mydll.dllはサードパーティのdllです。ソースコードはありませんが、ヘッダーの関数のプロトタイプは次のとおりです。
extern "C" {
const char* Init();
}
mydll.dll自体は、ディレクトリ "C:\ MyDllDir"に格納されている他のいくつかのdllに依存しているため、SetDllDirectoryが呼び出されます。
いくつかの観察:
- バニラのLoadLibraryを機能させることはできませんでしたが
LoadLibraryEx
、引数を使用すると機能するように見えGetLastError
ます(その場合は0
) - 返されたdllのアドレスが奇妙に見える(
0x43900000
) - によって返される関数のアドレス
GetProcAddress
も奇数(0x43902b34
)ですが、DLL Export ViewerはInit関数にオフセットがあると報告します0x00002b34
) - 返された関数を呼び出すと、常にアクセスエラーがスローされます。
_ccdecl
関数の__stdcall
などのすべての組み合わせを試しましtypedef
たが、常に同じエラーが発生します。私はありとなしで試しましたextern C
その他のデータ:
- このc++コードは、管理された環境から呼び出されています
- 私はWindows7、64ビットで実行していますが、管理されていない部分をwin32としてコンパイルしています
私は何が間違っているのですか?どうすればこれをデバッグできますか?依存関係ウォーカーとdllエクスポートビューアを試しましたが、すべて問題ないようです。