ファイルのバージョン情報を取得する
101 FileVersionInfo 動作確認 Delphi2007 更新日 2010/06/27(日)

ファイルのプロパティ、[バージョン情報]タブに表示される
バージョン情報の値を取得する関数です。

────────────────────
{-------------------------------
//  ファイルのプロパティ、バージョン情報を取得する
機能:       ファイル、プロパティの[バージョン情報]タブに表示される
            各種の値を取得します。
引数説明:   TitleKey:バージョン情報の各値のタイトルを指定する
            指定できるキー値は次のとおり、//以降はWindowsで表示される名称
                CompanyName     //会社名
                FileDescription //説明 or ファイル記述子
                FileVersion     //ファイル バージョン
                InternalName    //内部名 or 内部ファイル名
                LegalCopyright  //著作権 or 著作権情報
                LegalTrademarks //商標
                OriginalFileName//正式ファイル名 or オリジナルファイル名
                ProductName     //製品名
                ProductVersion  //製品バージョン
                Comments        //コメント
参考:
履歴:       2003/09/28
//------------------------------}
function GetFileVersionInformation(FileName, TitleKey: String): String;
const
  coTRANSLATION     = '\\VarFileInfo\\Translation';
  coSTR_FILE_INFO   = '\\StringFileInfo\\';
var
  fileVarsionInfoSize   :Integer;
  dummy         :DWORD;
  versionInfoSize   :DWORD;
  pFileVarsionInfo,
  translation,
  infoPointer       :Pointer;
  varValue      :String;
begin
  {バージョン情報サイズを得る}
  fileVarsionInfoSize := GetFileVersionInfoSize(PChar(FileName), dummy);

  if fileVarsionInfoSize > 0 then begin
    {バージョン情報用メモリ確保}
    GetMem(pFileVarsionInfo, fileVarsionInfoSize);

    try
      {バージョン情報リソース取得}
      GetFileVersionInfo(PChar(FileName), 0, fileVarsionInfoSize, pFileVarsionInfo);

      {変換テーブルへのポインタ取得}
      VerQueryValue(pFileVarsionInfo, coTRANSLATION, translation, versionInfoSize);

      {バージョン情報リクエスト文字列を初期化する}
      varValue := coSTR_FILE_INFO +
                  IntToHex(LoWord(LongInt(translation^)), 4) +
                  IntToHex(HiWord(LongInt(translation^)), 4) + '\\';

      if VerQueryValue(pFileVarsionInfo, PChar(varValue + PropertyStr),
                       infoPointer, versionInfoSize) then begin
        {(注)ここは直接Resultに入れない方がいいはずです}
        varValue := String(PChar(infoPointer));
        Result := varValue;
      end;
    finally
      {メモリ解放}
      FreeMem(pFileVarsionInfo, fileVarsionInfoSize);
    end;{try...}

  end;
end;

{----------------------------------------
//テストコードは次の通り
procedure TForm1.Button3Click(Sender: TObject);
var
  Target: String;
begin
  with Memo1.Lines do
  begin
    Target := Application.ExeName;
    Add(GetFileProperty(Target, 'CompanyName'));        //会社名
    Add(GetFileProperty(Target, 'FileDescription'));    //説明 or ファイル記述子
    Add(GetFileProperty(Target, 'FileVersion'));        //ファイル バージョン
    Add(GetFileProperty(Target, 'InternalName'));       //内部名 or 内部ファイル名
    Add(GetFileProperty(Target, 'LegalCopyright'));     //著作権 or 著作権情報
    Add(GetFileProperty(Target, 'LegalTrademarks'));    //商標
    Add(GetFileProperty(Target, 'OriginalFileName'));   //正式ファイル名 or オリジナルファイル名
    Add(GetFileProperty(Target, 'ProductName'));        //製品名
    Add(GetFileProperty(Target, 'ProductVersion'));     //製品バージョン
    Add(GetFileProperty(Target, 'Comments'));           //コメント
  end;
end;
//----------------------------------------}

//------------------------------
────────────────────
この関数を使って
アプリケーションのタイトルにバージョン情報を
含めて表示させるコードを書いてみます。

────────────────────
type
  TVersionFormat = (vfMajorMinorReleaseBuild, vfMajorMinorRelease, vfMajorMinor);
{-------------------------------
//  アプリケーションのタイトルを生成する
機能:       『タイトル ver 1.0.0』という文字列を生成する
            Titleには『タイトル』
            VersionJuntionTextには『 ver 』
            VersionFormatに vfMajorMinorRelease を選択するとよい
備考:
履歴:       2006/09/18(月) 15:26
//------------------------------}
function ApplicationTitlePlusVersion(Title, VersionJuntionText: String;
 VersionFormat: TVersionFormat): String;

  function MajorMinorReleaseBuild: String;
  begin //出力形式:メジャー.マイナー.リリース.ビルド
    Result := GetFileVersionInformation(ParamStr(0), 'FileVersion');
  end;
  function MajorMinorRelease: String;
  begin //出力形式:メジャー.マイナー.リリース
    Result := ChangeFileExt(
      GetFileVersionInformation(ParamStr(0), 'FileVersion'), '')
  end;
  function MajorMinor: String;
  begin //出力形式:メジャー.マイナー
    Result := ChangeFileExt( ChangeFileExt(
      GetFileVersionInformation(ParamStr(0), 'FileVersion'), ''), '');
  end;

var
  VersionInfo: String;
begin
  case VersionFormat of
    vfMajorMinorReleaseBuild:
      VersionInfo := MajorMinorReleaseBuild;

    vfMajorMinorRelease:
      VersionInfo := MajorMinorRelease;

    vfMajorMinor:
      VersionInfo := MajorMinor;
  end;
  if VersionInfo = '' then
  begin
    Result := Title;
  end else
  begin
    Result := Title + VersionJuntionText + VersionInfo;
  end;
end;
//------------------------------


constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;

  {下:アプリケーションのタイトルを制御}
  Application.Title := ApplicationTitlePlusVersion(Application.Title, ' ver ', vfMajorMinorRelease);
  Self.Caption := ApplicationTitlePlusVersion(Self.Caption, ' ver ', vfMajorMinorRelease);
end;
//※FormCreateイベントでも記述可能
────────────────────
アプリケーションタイトルや
バージョン情報ダイアログなどで
バージョン表記をするとき、
情報を一元管理できるので結構便利です。