0

これが私のコードです。それを行うのは簡単なようですが、どういうわけかそれはうまくいきません。関数の最後の呼び出しは常にアクセスエラーで失敗します。

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エクスポートビューアを試しましたが、すべて問題ないようです。

4

1 に答える 1

1

すべて順調。*ポインターを介して関数を呼び出すときに使用する必要はありません。通常の関数のように呼び出します:

const char *res = iFunc();

それ以外の

const char *res = (*iFunc)();
于 2011-06-03T21:39:06.567 に答える