ウィンドウのGLコンテキストを保存するために私のプロジェクトでDetoursを使用しています。迂回がwglMakeCurrentで発生する
だから私は迂回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作成に必要なものです。希望のウィンドウ作成の直後に呼び出されるためです。
EDIT
他のOpenGL関数に同じ方法を適用する場合は、例えば、クラッシュしませんSwapBuffers、glFinishなど。
私が単にDLLをロードし、wglMakeCurrent
を実行する孤立したテストの場合、それは動作します。
私のDLLをアプリケーションに注入し、このアプリケーションでwglMakeCurrent
を使用すると、呼び出しでDetoursが無限再帰を引き起こします。
クラッシュ時にデバッガでコールスタックを実行してみます。次に、コールスタックをここに掲示します。 –
@MarcSherman私はより多くのテストを行い、実際にソフトウェアをクラッシュさせている無限再帰であることを知りました。私の新しいEditを見てくださいEdit – KuramaYoko
私の推測では、あなたのフックがtrueWglMakeCurrentを呼び出すことによって無限再帰を引き起こしていると思います。 trueWglMakeCurrentを逆アセンブルすると(例えばwindbg'uf trueWglMakeCurrent'の場合)、最初の命令としてhookedWglMakeCurrentにJMPが表示されます。私は、フックをインストールするDetours APIも実際の実装を呼び出すときにあなたのフックが呼び出すべき関数ポインタを返すと信じています。 –