2009年4月2日木曜日

逆double thunking

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 件のコメント: