double thunkingに逆も何もないけどなんとなく…。
状況としては次の関数をnative C++でコンパイルしa.dllに入れます。
__declspec(dllexport) LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam );
そしてa.dllにリンクするb.exe内でC++/CLIを使って次の呼び出しをします。
HINSTANCE module = GetModuleHandleW( L"a.dll" );するとどうなるか。
SetWindowsHookExW( WH_CBT, CBTProc, module, 0 );
コンパイラは単なる関数ポインタCBTProcをmanaged codeから呼べるようwrapします(1段目のthunk)。
次にwrapされたmanagedな関数ポインタをunmanaged codeから呼べるようにwrapします(2段目のthunk)。
この2重にthunkされた関数ポインタをSetWindowsHookExW()に渡します。
#pragma unmanagedとか試してみましたが変化しませんでした。結局、この部分だけソースコードを独立させ、/clrコンパイルオプションを外して強制的にnative C++としてコンパイルすることで回避できました。もっとsmartな方法がありそうですが、見つけられなかった。
0 件のコメント:
コメントを投稿