web-dev-qa-db-ja.com

C ++のGetProcAddress関数

こんにちは、私はDLLをプロジェクトにロードしましたが、GetProcAddress関数を使用するときは常にNULLを返します!どうすればよいですか?この関数を使用します(double GetNumber(double x)) 「MYDLL.dll」内

これが私が使ったコードです:

typedef double (*LPGETNUMBER)(double Nbr);
HINSTANCE hDLL = NULL;
LPGETNUMBER lpGetNumber;
hDLL = LoadLibrary(L"MYDLL.DLL");
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
16
Alireza

戻りコードをチェックしてGetLastError()を呼び出すと、解放されます。ここで戻りコードを2回チェックする必要があります。実際には、戻りコードをゼロ回チェックしています。

_hDLL = LoadLibrary(L"MYDLL.DLL");
_

hDLLを確認してください。 NULLですか?その場合は、GetLastError()を呼び出して理由を調べます。 「ファイルが見つかりません」のように単純な場合もあります。

_lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
_

lpGetNumberがNULLの場合、GetLastError()を呼び出します。 procアドレスが見つからなかった理由がわかります。いくつかのシナリオが考えられます。

  1. GetNumberという名前のexported関数はありません
  2. GetNumberという名前のエクスポートされた関数がありますが、それは_extern "c"_とマークされていないため、 name mangling になります。
  3. hDLLは有効なライブラリハンドルではありません。

上記の#1であることが判明した場合は、次のように__declspec(dllexport)を使用して宣言を装飾し、関数をエクスポートする必要があります。

MyFile.h

___declspec(dllexport) int GetNumber();
_

上記の#2であることが判明した場合は、次のようにする必要があります。

_extern "C"
{
  __declspec(dllexport) int GetNumber();
};
_
46
John Dibling

GetNumber関数が___stdcall_関数としてエクスポートされているかどうかを確認できます。

その場合は、GetProcAddress(hDLL, "_GetNumber@N");を試してください。ここで、NGetNumberの引数リストの合計バイト数です。たとえば、関数のシグネチャがint GetNumber(int a, double b)の場合、DLLの実際の名前は__GetNumber@12_になります。

リファレンス: __ stdcall

2
user1667687

おそらく LoadLibrary() が失敗しました。あなたはそれが何を返しているのかを確認していないので、あなたはそれを見ることができません:

関数が失敗した場合、戻り値はNULLです。拡張エラー情報を取得するには、GetLastErrorを呼び出します。

編集:

DLLコードで関数をエクスポートする方法はわかりませんが、 this thread は、GetProcAddressが失敗する理由のいくつかを説明しています。

2
karlphillip