У меня есть функция, импортированная из DLL.Я контролирую источник исполняемого файла хоста и динамической библиотеки.Теперь в DLLMain я использовал MessageBox, чтобы открыть адрес экспортируемой функции, и сравнил его, используя точку останова, с указателем на функцию, возвращаемым GetProcAddress, и они идентичны.
Однако, когда я пытаюсь вызвать функцию, я получаю нарушение прав доступа.Рассматриваемая функция просто возвращает NULL и не имеет логики, поэтому она не может быть специально сгенерирована функцией.
Как вызов известного действительного указателя функции с правильной подписью и проверенной безопасной логикой может привести к нарушению доступа?
Редактировать: информация, полученная в результате отдельного вопроса о том, почему отладчик умираетв этой ситуации говорит о том, что мой стек тоже разбился?Это имеет больше смысла, чем AV, но указатель на функцию и функция полностью совместимы, а адрес верен.
extern "C" Render* __cdecl CreateRender(WindowsOS* ptr) {
return nullptr;
}
typedef Render*(__cdecl *RendererCreateFunction)(WindowsOS*);
Я использовал небольшой фрагмент кода в DLLMain, чтобы определить, что онифактически совместим с компилятором.
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
) {
RendererCreateFunction func = &CreateRender;
}
Если они несовместимы (они содержат одинаковый заголовок), тогда компилятор должен выдать ошибку и отказаться от сборки DLL, но он принимаетэто просто отлично.