本体のバージョンと異なるバージョンの日本語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では使えません。