我在项目中使用Detours以保存窗口的GL上下文。
所以我遵循了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
调用上导致无限递归。
答案 0 :(得分:0)
问题是无法正确链接函数引起的无限递归。
Detours创建一个指向原始wglMakeCurrent
的函数指针,在我的情况下,我存储在trueWglMakeCurrent
中。但是它只有在我声明它并在具有DLLMain
和DetourAPI用法的同一文件上使用它时才有效。完全像例子:
static BOOL (WINAPI * trueWglMakeCurrent)(HDC,HGLRC) = wglMakeCurrent;
GTNSPECTRA_C_EXPORT BOOL WINAPI hookedWglMakeCurrent(HDC hDC, HGLRC hRC)
{
...
return trueWglMakeCurrent(hDC, hRC);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD reason,
LPVOID lpReserved)
{
...
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)trueWglMakeCurrent, hookedWglMakeCurrent);
DetourTransactionCommit();
...
return TRUE;
}