Я использовал документацию 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
, Таким образом, существует несоответствие в возвращаемом значении.
Предполагая, что вы действительно хотите вернуться 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
).
Так что вы должны просто привести его к FARPROC
:
return (FARPROC)lib;