Visual Studio 2010 での ISAPI 開発

このたび、えらく昔に開発したISAPIフィルタを更新する必要がでてきた。そのため、開発環境も新たに Visual Studio 2010 (以下、VS2010) に移行することとした。さて、とりあえず、現状のプロジェクトを VS2010 で開いて、自動アップグレードを実行。

とくに問題なく終わった。さて、ビルド。すると、「afxisapi.h」がないと怒られる。どうやら、VS2008から ISAPI開発用のMFCラッパが無くなってしまったようだ。

CHttpServer not included in Visual Studio 2008
http://blogs.msdn.com/b/jpsanders/archive/2007/12/10/chttpserver-not-included-in-visual-studio-2008.aspx

この記事によると、必要なファイルやライブラリをVS2005が頂戴すればいいらしいが、MFCをスタティックリンク設定しなければならないらしい。

これは、これで問題がある。なんとか、MFCを共有ライブラリとしてビルドしながら、従来通りのAFXラッパを使用してVS2010でISAPIの開発ができないものか。

いろいろ、ためしてみたところ、上記、記事にあるヘッダファイルやライブラリをVS2005から頂戴してくるところはそのままに、MFC共有ビルド可能なようにするには、以下のような定義を StdAfx.h に入れることで、可能なようだ。

namespace ATL
{
#ifndef _CONVERSION_DONT_USE_THREAD_LOCALE
typedef UINT (WINAPI *ATLGETTHREADACP)();

inline UINT WINAPI _AtlGetThreadACPFake() throw()
{
	UINT nACP = 0;
	LCID lcidThread = ::GetThreadLocale();
	char szACP[7];
	if (::GetLocaleInfoA(lcidThread, LOCALE_IDEFAULTANSICODEPAGE, szACP, 7) != 0)
	{
		char* pch = szACP;
		while (*pch != '\0')
		{
			nACP *= 10;
			nACP += *pch++ - '0';
		}
	}
	if (nACP == 0)
	nACP = ::GetACP();

	return nACP;
}
inline UINT WINAPI _AtlGetThreadACPReal() throw()
{
	return( CP_THREAD_ACP );
}

extern ATLGETTHREADACP g_pfnGetThreadACP;

inline UINT WINAPI _AtlGetThreadACPThunk() throw()
{
	OSVERSIONINFO ver;
	ATLGETTHREADACP pfnGetThreadACP;
	ver.dwOSVersionInfoSize = sizeof( ver );
	::GetVersionEx( &ver );
	if( (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) && (ver.dwMajorVersion >= 5) )
	{
		pfnGetThreadACP = _AtlGetThreadACPReal;
	}
	else
	{
		pfnGetThreadACP = _AtlGetThreadACPFake;
	}
	InterlockedExchangePointer( reinterpret_cast< void** >(&g_pfnGetThreadACP), reinterpret_cast< void** >(pfnGetThreadACP) );

	return( g_pfnGetThreadACP() );
}

ATLGETTHREADACP g_pfnGetThreadACP = _AtlGetThreadACPThunk;

#else

inline UINT WINAPI _AtlGetConversionACP() throw()
{
	return( CP_ACP );
}

#endif
};  

お困りの方、試してみてください。