2006-02-20 [長年日記]

[Q3] バージョン番号

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

[Q3] 今日のNightly Build

Windows版が失敗しました。

[]

トップ «前の日記(2006-01-31) 最新 次の日記(2006-03-01)»