SEXYHOOK_DARKCASTについて
boost勉強会#2 で紹介するのを忘れていた SEXYHOOK_DARKCAST についての説明です。
SEXYHOOK_DARKCASTは、どんなポインタ型でも、 void* にキャストするための関数です。
SEXYHOOK2 では以下のように定義しています。
//強制的にポインタにする(邪道) #ifdef __GNUC__ // ... を悪用した技 static void* SEXYHOOK_DARKCAST(int dummy, ... ) { return *(void**)(&dummy + 1); } #else //msvc のみ gcc だとエラーがでるけど、アーキテクチャ依存しないので好きだ! template<typename _T> static void* SEXYHOOK_DARKCAST(int dummy, _T p) { return *reinterpret_cast<void**>(&p); } #endif
SEXYHOOK では、 &myclass:method などのメソッドへのポインタを取得しているわけですが、
C++の型変換の保護により、void* に変換することができません。
void * p = (void*) &myclass:method; //エラー
それをとにかく黙って変換しろ!というヤツです。
下の方は、以下の記事で使われていたソースコードにあったテクニックを元にしています。
http://www.codeproject.com/KB/cpp/thunk32.aspx
template<typename _T> static void* SEXYHOOK_DARKCAST(int dummy, _T p) { return *reinterpret_cast<void**>(&p); }
上の方は、 printf の第2引数以降には ... だから何でも渡せるよね! っていう特性を悪用したものです。
アーキテクチャ依存なんであんまり好きではないんですが、、、
static void* SEXYHOOK_DARKCAST(int dummy, ... ) { return *(void**)(&dummy + 1); }
とりあえず、現状これで動作しています。