[Win32] A* <-> LONG のキャスト

VC8.0 にて、SDK によるプログラミングを行う場合、本件を忘れないようにメモしておく

	// Windows 2000 にて、::SetWindowLongPtr の前に ::CreateWindowEx が
	// 存在すると ::GetLastError が 1411「そのクラスはありません。」を
	// 返す場合があるので、::CreateWindowEx と ::SetWindowLongPtr の間に
	// ::SetLastError(0); を挿入すると良いようです
	//
	// この時、::CreateWindowEx は NULL を返している訳ではないようですが、
	// エラー時に毎回 ::SetLastError(0); するのは無駄であるので、::SetWindowLongPtr の
	// おかしな仕様(返り値の値域)に対応するため、::SetWindowLongPtr の直前で
	// ::SetLastError(0); することにします

	::SetLastError(0);

#ifdef _WIN64
	if (0 == ::SetWindowLongPtr(
		member_hWnd, GWLP_USERDATA, reinterpret_cast(this)) &&
		(0 != ::GetLastError())){
#else
	if (0 == ::SetWindowLongPtr(
		member_hWnd, GWLP_USERDATA, static_cast(reinterpret_cast(this))) &&
		(0 != ::GetLastError())){
#endif

		(void)::DestroyWindow(member_hWnd);
		return false;
	}

BACK


View My Stats