こんにちは、私は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");
戻りコードをチェックしてGetLastError()
を呼び出すと、解放されます。ここで戻りコードを2回チェックする必要があります。実際には、戻りコードをゼロ回チェックしています。
_hDLL = LoadLibrary(L"MYDLL.DLL");
_
hDLL
を確認してください。 NULLですか?その場合は、GetLastError()
を呼び出して理由を調べます。 「ファイルが見つかりません」のように単純な場合もあります。
_lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
_
lpGetNumber
がNULLの場合、GetLastError()
を呼び出します。 procアドレスが見つからなかった理由がわかります。いくつかのシナリオが考えられます。
GetNumber
という名前のexported関数はありませんGetNumber
という名前のエクスポートされた関数がありますが、それは_extern "c"
_とマークされていないため、 name mangling になります。hDLL
は有効なライブラリハンドルではありません。上記の#1であることが判明した場合は、次のように__declspec(dllexport)
を使用して宣言を装飾し、関数をエクスポートする必要があります。
___declspec(dllexport) int GetNumber();
_
上記の#2であることが判明した場合は、次のようにする必要があります。
_extern "C"
{
__declspec(dllexport) int GetNumber();
};
_
GetNumber
関数が___stdcall
_関数としてエクスポートされているかどうかを確認できます。
その場合は、GetProcAddress(hDLL, "_GetNumber@N");
を試してください。ここで、N
はGetNumber
の引数リストの合計バイト数です。たとえば、関数のシグネチャがint GetNumber(int a, double b)
の場合、DLLの実際の名前は__GetNumber@12
_になります。
リファレンス: __ stdcall
おそらく LoadLibrary()
が失敗しました。あなたはそれが何を返しているのかを確認していないので、あなたはそれを見ることができません:
関数が失敗した場合、戻り値はNULLです。拡張エラー情報を取得するには、GetLastErrorを呼び出します。
編集:
DLLコードで関数をエクスポートする方法はわかりませんが、 this thread は、GetProcAddressが失敗する理由のいくつかを説明しています。