Я использую Detours в моем проекте, чтобы сохранить GL-контекст окна.Сбой при сбоях с wglMakeCurrent
Так я следовал примеру кода, который поставляется с Detours 3.0 Express Edition:
static BOOL (WINAPI * trueWglMakeCurrent)(HDC, HGLRC) = wglMakeCurrent;
BOOL WINAPI hookedWglMakeCurrent(HDC hdc, HGLRC hglrc);
BOOL WINAPI hookedWglMakeCurrent(HDC hdc, HGLRC hglrc)
{
wContext = hglrc;
wDC = hdc;
return trueWglMakeCurrent(hdc, hglrc); //CRASH HERE
//return TRUE;
}
Но он выходит из строя при вызове оригинального метода WGL. Если я изменю это, вернемся к return TRUE
, это не сработает. Но это тоже ничего не изменит.
hdc
и hglrc
имеют действительные адреса, и они, вероятно, соответствуют GL-контексту, который мне нужен, поскольку это называется сразу после желаемого создания окна.
РЕДАКТИРОВАТЬ
Это не ломается при применении того же метода к другим OpenGL функций, например, SwapBuffers, glFinish и т. Д.
В случае изолированного теста, в котором я просто загружаю свою DLL и выполняю команду wglMakeCurrent
, она работает.
В случае ввода моей DLL в приложение, а затем с использованием wglMakeCurrent
в этом приложении, Detours вызывает бесконечную рекурсию по вызову trueWglMakeCurrent
.
Попробуйте запустить его под отладчиком и получить стек вызовов во время сбоя. Затем разместите стек вызовов здесь. –
@MarcSherman Я проверил больше и узнал, что это действительно бесконечная рекурсия, которая вредит программному обеспечению. Взгляните на мой новый Edit – KuramaYoko
. Я предполагаю, что ваш крючок вызывает бесконечную рекурсию, вызывая trueWglMakeCurrent. Разбор trueWglMakeCurrent (для ex в windbg 'uf trueWglMakeCurrent') должен показать JMP, чтобы подключитьWglMakeCurrent в качестве первой инструкции. Я считаю, что API-интерфейсы Detours, устанавливающий hook, также возвращает указатель на функцию, который ваш хук должен вызывать, когда он хочет вызвать реальную реализацию. –