0

私は C++ の初心者で、このフォーラムhttp://www.blizzhackers.cc/viewtopic.php?p=2483118でコードを理解しようとしています。私はほとんどのエラーを解決することができましたが、これは私に問題を引き起こしている関数のコードです。

void LoadDll(char *procName, char *dllName)
{
    HMODULE hDll;
    unsigned long cbtProcAddr;

    hDll = LoadLibrary(dllName);
    cbtProcAddr = GetProcAddress(hDll, "CBTProc"); // The error points to this line

    SetWindowsHookEx(WH_CBT, cbtProcAddr, hDll, GetTargetThreadIdFromProcname(procName));
}
4

2 に答える 2

1

GetProcAddressa を返しますFARPROC(コンパイラ エラーを見ると、これは単なる typedef ですint(*)())。unsigned longは ではなく、FARPROC両者の間に暗黙の変換はありません。

GetProcAddressの結果をに保存する理由がわかりませんunsigned long。関数を取得する場合は、関数ポインターを格納します。正しい型 (SetWindowsHookExを取るHOOKPROC) を使用してキャストします。

HOOKPROC cbtProcAddr;

hDll = LoadLibrary(dllName);
cbtProcAddr = reinterpret_cast<HOOKPROC>(GetProcAddress(hDll, "CBTProc"));
于 2012-06-13T18:22:04.677 に答える
1

の定義を次のように変更しますcbtProcAddr

HOOKPROC cbtProcAddr;

整数を保持するように宣言された変数にポインター型の値を格納しようとしているため、コンパイラーは動揺します。GetProcAddress()( toの結果をキャストする必要があるかもしれHOOKPROCません。その関数は、ポイント先の関数の実際のシグネチャを認識していないためですが、呼び出しでのポインターの使用は、関数ポインターSetWindowsHookEx()のシグネチャと互換性があることを意味します。HOOKPROCタイプ。)

于 2012-06-13T18:18:34.397 に答える