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 };
お困りの方、試してみてください。