S.F.Traker(372) - thunk

公開:2009-11-23 16:47
更新:2020-02-15 04:36
カテゴリ:sftracker,c++,windows,audio,tracker

今日はWindowの基本的な部分の実装を行っていた。

最初に考えたのはHWNDとC++クラスインタンスとの結びつけなのだが、最初はWM_CREATE時に、SetWindowLongPtrのGWLP_USERDATAエリアにthisポインタを保存する方法でやってみたら、WM_CREATEイベント発生前にいろいろなメッセージが発生し、そのハンドリングに問題が生じることがわかったので、thunkを使うことにした。

アイデアは下記サイトから拝借した。
http://www.issei.org/blog/2007/12/good-bye-atl.html

xbyakを使って実装してみたところ、うまくいった。下記がそのコード。


struct hwnd_this_thunk : public Xbyak::CodeGenerator {
hwnd_this_thunk(impl* pimpl,WNDPROC proc)
{
push(eax);
mov(eax,ptr[esp + 8]);
mov(ptr[&(pimpl->hwnd_)],eax);
mov(eax,(DWORD)pimpl);
mov(ptr[esp + 8],eax);
pop(eax);
jmp(proc);
}
};

http://sourceforge.jp/projects/sftracker2/svn/view/sftracker2/?root=sftracker2