【问题标题】:Use delay load to load correct library - return value type error使用延迟加载加载正确的库 - 返回值类型错误
【发布时间】:2012-10-18 18:28:28
【问题描述】:

我在这里使用了 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,这就是我所做的......

【问题讨论】:

    标签: c++ winapi compiler-errors return-value delay-load


    【解决方案1】:

    LoadLibrary() 返回一个HMODULE。您的delayHook() 函数返回FARPROC。所以返回值不匹配。 假设你真的想返回由LoadLibrary() 返回的HMODULE,你可能想使用像reinterpret_cast 这样的转换:

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

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

    【讨论】:

      【解决方案2】:

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

      return (FARPROC)lib;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        相关资源
        最近更新 更多