使用延迟加载加载正确的库 - 返回值类型错误

Use delay load to load correct library - return value type error

本文关键字:返回值 类型 错误 延迟加载 加载      更新时间:2023-10-16

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

LoadLibrary()返回一个HMODULE。您的delayHook()函数返回一个FARPROC。因此,返回值不匹配。 假设你真的想返回HMODULELoadLibrary()返回,你可能想使用像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)。

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

return (FARPROC)lib;