1

我在这里使用了 msdn 文档:http: //msdn.microsoft.com/en-us/library/f0fkfy9y (v=vs.100).aspx

它在那里指定:

case dliNotePreLoadLibrary :
//If you want to return control to the helper, return 0.
//Otherwise, return your own HMODULE to be used by the 
//instead of having it call LoadLibrary itself

所以我尝试了以下方法:

FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli)
{
    switch (dliNotify) {
        case dliStartProcessing :
        case dliNotePreGetProcAddress :
        case dliFailLoadLib :
        case dliFailGetProc :
        case dliNoteEndProcessing : 
          return 0;
          break;
        case dliNotePreLoadLibrary :
            {
                char* dllPath = getDllPath();
                HMODULE lib = LoadLibrary(dllPath);
                return lib;
            }
            break;      
        default :
            return NULL;
    }
    return NULL;
}

返回 HMODULE 时出现错误:

'return' : 无法从 'HMODULE' 转换为 'FARPROC'。

问题是什么?我在做一些破旧的事吗?他们确实说返回你自己的 HMODULE,这就是我所做的......

4

2 回答 2

1

LoadLibrary()返回一个HMODULE. 您的delayHook()函数返回一个FARPROC. 所以返回值不匹配。假设您真的想返回HMODULE返回的LoadLibrary(),您可能需要使用如下类型的转换reinterpret_cast

case dliNotePreLoadLibrary :
{
    char* dllPath = getDllPath();
    HMODULE lib = LoadLibrary(dllPath);
    return reinterpret_cast<FARPROC>(lib);
}

旁注:在当今世界,您应该使用 Unicode 而不是 ANSI/MBCS,因此您dllPath最好是 Unicode 字符串(例如const wchar_t*,或CString,或std::wstring)。

于 2012-10-18T10:28:28.357 回答
0

所以你应该简单地将它转换为FARPROC

return (FARPROC)lib;
于 2012-10-18T10:27:47.183 回答