喫茶XRAYトップページ

[スレッド全体
]

[5328] XE2 バージョン情報の取得にて返信 削除
2011/9/28 (水) 22:26:03 Sara
みなさん、こんばんは。

Delphi XE2(Update1)で、以下のコードをもちいてバージョン情報の取得をする場合、
プロジェクトオプションのロケーションを日本語(日本)に設定すると、バージョン情報が
取得できません。(標準の英語 (米国)に戻すと取得できる)

何故かわかる方、ご教示をお願いします。m(_ _)m
(まぁ、英語(米国)にしておけば、動作するので、困ってはいないんですが(^^; )

function GetVersionInfo(KeyWord: TVerResourceKey): string;
const
  Translation = '\VarFileInfo\Translation';
  FileInfo = '\StringFileInfo\%0.4s%0.4s\';
var
  BufSize, HWnd: DWORD;
  VerInfoBuf: Pointer;
  VerData: Pointer;
  VerDataLen: Longword;
  PathLocale: String;
begin
  BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), HWnd);
  if BufSize <> 0 then
  begin
    GetMem(VerInfoBuf, BufSize);
    try
      GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, VerInfoBuf);
      VerQueryValue(VerInfoBuf, PChar(Translation), VerData, VerDataLen);
      if not (VerDataLen > 0) then
        raise Exception.Create('情報の取得に失敗しました');
      PathLocale := Format(FileInfo + KeyWordStr[KeyWord],
        [IntToHex(Integer(VerData^) and $FFFF, 4),
         IntToHex((Integer(VerData^) shr 16) and $FFFF, 4)]);
      VerQueryValue(VerInfoBuf, PChar(PathLocale), VerData, VerDataLen);
//ここでVerDataLenが0になる・・・(英語(米国)だと0以外になる)
      if VerDataLen > 0 then
      begin
        result := '';
        SetLength(result, VerDataLen);
        StrLCopy(PChar(result), VerData, VerDataLen);
      end;
    finally
      FreeMem(VerInfoBuf);
    end;
  end;
end;


[5329] Re:XE2 バージョン情報の取得にて返信 削除
2011/9/28 (水) 22:52:01 Sara
みなさん、こんばんは。

ちょっと、情報が足りないんで、追加・・・
type
  TVerResourceKey = (
        vrComments,         // コメント
        vrCompanyName,      // 会社名
        vrFileDescription,  // 説明
        vrFileVersion,      // ファイルバージョン
        vrInternalName,     // 内部名
        vrLegalCopyright,   // 著作権
        vrLegalTrademarks,  // 商標
        vrOriginalFilename, // 正式ファイル名
        vrPrivateBuild,     // プライベートビルド情報
        vrProductName,      // 製品名
        vrProductVersion,   // 製品バージョン
        vrSpecialBuild);     // スペシャルビルド情報

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

const
  KeyWordStr: array [TVerResourceKey] of String = (
        'Comments',
        'CompanyName',
        'FileDescription',
        'FileVersion',
        'InternalName',
        'LegalCopyright',
        'LegalTrademarks',
        'OriginalFilename',
        'PrivateBuild',
        'ProductName',
        'ProductVersion',
        'SpecialBuild');


implementation

{$R *.dfm}


バージョン情報取得時は、こんな感じで・・・

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Caption := GetVersionInfo(vrFileVersion);
end;



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82