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);
}

とりあえず、現状これで動作しています。