今のバージョンは?

大概のソフトには、現在のバージョン表示のメニューがあります。
頻繁にバージョンアップする人なんかだと、バージョン情報を更新しても、こっちの表示を書きかえるのを忘れたりする・・・・のは私だけ?(笑)
こっちの表示なんぞ、自動的に変わる様にしてしまえというやつです。

unit about;

interface

uses
  Windows, SysUtils, Forms;

resourcestring
  MailAddress = 'leafel@mcn.ne.jp';
  WebAddress  = 'http://hp.vector.co.jp/authors/VA015850/';

procedure AboutBox;

implementation

procedure AboutBox;
const
  NL: string = #$D#$A;
var
  BuffSize, Ignore: Cardinal;
  P: Pointer;
  FileDescription, LegalCopyright: PChar;
begin
  BuffSize := GetFileVersionInfoSize(PChar(Application.ExeName), Ignore);
  P := AllocMem(BuffSize);
  GetFileVersionInfo(PChar(Application.ExeName), Ignore, BuffSize, P);

  VerQueryValue(P, PChar('\StringFileInfo\041103A4\FileDescription'), Pointer(FileDescription), Ignore);
  VerQueryValue(P, PChar('\StringFileInfo\041103A4\LegalCopyright'),  Pointer(LegalCopyright),  Ignore);

  Application.MessageBox(
    PChar(
      FileDescription           + NL +
      LegalCopyright            + NL +
      ''                        + NL +
      'mail: '    + MailAddress + NL +
      'webpage: ' + WebAddress
    ),
    PChar('About ' + Application.Title),
    MB_OK
  );

  FreeMem(P);
end;

end.

こんな感じで、できます。

わかりづらいのは、VerQueryValue の第二引数でしょうか。
041103A4 って言うのは日本語だってことです。
0411 が日本語で、03A4 が シフトJIS を表すようです。
FileDescription、LegalCopyright が書いてあるとこには、欲しい情報が入ります。
CompanyName, FileDescription, FileVersion, InternalName, LegalCopyright, OriginalFilename, ProductName, ProductVersion などが定義されているみたいです。

当然ですが、読み込み元であるファイルのバージョン情報を正しくいれないと意味がありません(笑)
情報そのものがない場合には、エラーチェックをどこもしてないので、すごいことになること請け合いです(爆)


Return index page