Используйте задержку загрузки для загрузки правильной библиотеки — ошибка типа возвращаемого значения

Я использовал документацию 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, и это то, что я сделал …

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).

1

Другие решения

Так что вы должны просто привести его к FARPROC:

return (FARPROC)lib;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector