本体のバージョンと異なるバージョンの日本語UIをロードしてしまうと問題が起きるので、ロードするときにバージョン番号をチェックして異なる場合にはロードしないようにしました。
ファイルバージョンを取得するにはGetFileVersionInfoなどを使うのですが、すでにロードしているDLLのバージョンを取得するのにパスを指定してロードさせるのは馬鹿げています。というわけで、バージョンリソースを直接読み込んで取得してみました。
std::pair<DWORD, DWORD> getVersion(HINSTANCE hInst) { std::pair<DWORD, DWORD> version(0, 0); HRSRC hrsrc = ::FindResource(hInst, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION); if (hrsrc) { HGLOBAL hres = ::LoadResource(hInst, hrsrc); if (hres) { unsigned char* p = static_cast<unsigned char*>(::LockResource(hres)); DWORD dwSize = ::SizeofResource(hInst, hrsrc); std::vector<unsigned char> buf(p, p + dwSize); VS_FIXEDFILEINFO* pInfo = 0; UINT nInfoSize = 0; if (::VerQueryValue(&buf[0], _T("\\"), reinterpret_cast<void**>(&pInfo), &nInfoSize)) { version.first = pInfo->dwFileVersionMS; version.second = pInfo->dwFileVersionLS; } } } return version; }
LockResourceで得られたバッファへのポインタを直接VerQueryValueに渡すとアクセス違反が発生するのでバッファのコピーを作成する必要があります。
ちなみに、Windows CEではバージョン関係のAPIは3.0から実装されているはずですが、3.0ベースのPocket PC 2000では使えません。