22

皆さん、こんにちは。プロジェクトに DLL をロードしましたが、GetProcAddress 関数を使用するたびに。NULL を返します。私は何をすべきか?「MYDLL.dll」でこの関数( double GetNumber(double x) )を使用します

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

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

3 に答える 3

54

リターンコードを確認して電話をかけると、GetLastError()あなたは解放されます。ここでリターン コードを 2 回チェックする必要があります。実際にはリターンコードをゼロ回チェックしています。

hDLL = LoadLibrary(L"MYDLL.DLL");

確認してくださいhDLL。ヌルですか?その場合は、電話GetLastError()して理由を確認してください。「ファイルが見つかりません」と同じくらい簡単かもしれません。

lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");

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

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

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

MyFile.h

__declspec(dllexport) int GetNumber();

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

extern "C"
{
  __declspec(dllexport) int GetNumber();
};
于 2011-05-17T13:34:56.380 に答える
4

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

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

参考:__stdcall

于 2015-11-04T04:57:47.180 に答える
3

おそらくLoadLibrary()失敗しました。どうやらあなたはそれが何を返しているのかをチェックしていないので、あなたはそれを見ることができません:

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

編集:

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

于 2011-05-17T13:27:24.437 に答える