2011/06/16 追記
2011/06/15 に MS11-025 が更新されたので,以下は古い情報になります.
どちらかというと,以下の影響
Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ (KB2467175)
Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージ (KB2467174)
MS11-025
Win 7 で,AFX_IDS_~ の表示が英語になってしまう.
Open , Save As , 印刷プレビューのボタン
All Files (*.*)
Failed to create empty document.
C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\l.jpn
AppCore.cpp の _AfxLoadLangDLL と思うが,うまく確かめられない.
ここが呼ばれる前のコードを切り出して lcid は 1041 で,JPN が求まっている所までは確認.
デバッグ版では,MFC90JPN.dll がロードされている(デバッガやリソースモニターで確認).
C:\Windows\WinSxS\x86_microsoft.vc90.mfcloc_1fc8b3b9a1e18e3b_9.0.30729.5570_none_4977a39175471b31\MFC90JPN.DLL
リリース版に,デバッグ情報を付加して動作を見ると
SXS: Invalid parameter(s) passed to FindActCtxSection*()
dwFlags = 0x00000001
ReturnedData = 0018F58C
->cbSize = 0
FindActCtxSection を検索すると,
Visual C++ MFC and ATL FindActCtxSection
そこからのリンクは Martin’s Blog 自動翻訳
_AfxLoadLangDLL のコードを比べると,
Microsoft Visual Studio 2005 Service Pack 1 (KB2465367) 適用前
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
…
int ret;
ATL_CRT_ERRORCHECK_SPRINTF(ret = _sntprintf_s(szLangDLL,_countof(szLangDLL),
_countof(szLangDLL)-1,pszFormat,pszPath,szLangCode));
if(ret == -1 || ret >= _countof(szLangDLL)) {
ASSERT(FALSE);
return NULL;
}
hInstance = ::LoadLibrary(szLangDLL);
return hInstance;
}
適用後
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
…
int ret;
ATL_CRT_ERRORCHECK_SPRINTF(ret = _sntprintf_s(szLangDLL,_countof(szLangDLL),
_countof(szLangDLL)-1,pszFormat,pszPath,szLangCode));
if(ret == -1 || ret >= _countof(szLangDLL)) {
ASSERT(FALSE);
return NULL;
}
TCHAR *pszFilename = ::PathFindFileName(szLangDLL);
ACTCTX_SECTION_KEYED_DATA data;
if (FindActCtxSectionString( FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,pszFilename, &data) ) {
// Load using the dll name only…
hInstance = ::LoadLibraryEx(pszFilename, NULL, LOAD_LIBRARY_AS_DATAFILE);
}
else { // Load using the full path…
hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);
}
return hInstance;
}
FindActCtxSectionString によって,Win 2K では動作しなくなるらしい.
2011/05/10 追記
Ted’s Blog Fixing problems with FindActCtxSectionString in MFC security updates
static.exe での Win2K 対応と,ACTCTX_SECTION_KEYED_DATA の初期化など
比べてもあまり意味はないが,VC 2010 では
static HINSTANCE _AfxLoadLangDLL(LPCTSTR pszFormat, LPCTSTR pszPath, LCID lcid)
{
TCHAR szLangDLL[_MAX_PATH+14];
TCHAR szLangCode[4];
HINSTANCE hInstance;
if (lcid == LOCALE_SYSTEM_DEFAULT) {
Checked::tcscpy_s(szLangCode, _countof(szLangCode), _T(“LOC”));
}
else {
int nResult;
nResult = ::GetLocaleInfo(lcid, LOCALE_SABBREVLANGNAME, szLangCode, 4);
if (nResult == 0)
return NULL;
ASSERT( nResult == 4 );
}
int ret;
ATL_CRT_ERRORCHECK_SPRINTF(ret = _sntprintf_s(szLangDLL,_countof(szLangDLL),
_countof(szLangDLL)-1,pszFormat,pszPath,szLangCode));
if(ret == -1 || ret >= _countof(szLangDLL)) {
ASSERT(FALSE);
return NULL;
}
hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);
return hInstance;
}
pszPath は “C:\Windows\system32\” になっている.