1

GetFileVersionInfoSize が 0 (ゼロ) で、GetFileVersionInfo が何も返さない

私はこのように使用しています:

function FileVersion(const FileName: TFileName): String;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  GetMem(PVerInfo, VerInfoSize);
  try
    if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
      if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
        with PVerValue^ do
          Result := Format('v%d.%d.%d build %d', [
            HiWord(dwFileVersionMS), //Major
            LoWord(dwFileVersionMS), //Minor
            HiWord(dwFileVersionLS), //Release
            LoWord(dwFileVersionLS)]); //Build
  finally
    FreeMem(PVerInfo, VerInfoSize);
  end;
end;

スタック応答に基づいて、Build で FileVersion を取得します

ほとんどの場合に機能します。

ありがとう

4

1 に答える 1

5

の戻り値をチェックしていませんGetFileVersionInfoSize。ファイル名が無効であるか、利用可能なバージョン情報がない場合、ゼロ (false) が返され、ドキュメントには、GetLastError. Delphi 2007 を使用しているため、クロスプラットフォームの互換性は (少なくとも今のところ) 問題ではなく、SysErrorMessage(GetLastError)失敗した理由の文字列の説明を取得するために使用できます。

何かが失敗した場合にエラー メッセージを返すように記述しました。もちろん、実際のアプリケーションでは、おそらくそうしたくないでしょう。

これは機能します(Delphi 7、Win7 64ビットでテスト済み):

function FileVersion(const FileName: TFileName): String;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
  iLastError: DWord;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  if VerInfoSize > 0 then
  begin
    GetMem(PVerInfo, VerInfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
      begin
        if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
          with PVerValue^ do
            Result := Format('v%d.%d.%d build %d', [
              HiWord(dwFileVersionMS), //Major
              LoWord(dwFileVersionMS), //Minor
              HiWord(dwFileVersionLS), //Release
              LoWord(dwFileVersionLS)]); //Build
      end
      else
      begin
        iLastError := GetLastError;
        Result := Format('GetFileVersionInfo failed: (%d) %s', 
                      [iLastError, SysErrorMessage(iLastError)]);
      end;
    finally
      FreeMem(PVerInfo, VerInfoSize);
    end;
  end
  else
  begin
    iLastError := GetLastError;
    Result := Format('GetFileVersionInfo failed: (%d) %s', 
                     [iLastError, SysErrorMessage(iLastError)]);
  end;
end;

WinAPI 呼び出しの戻り値を常にテストします。MSDN のドキュメントには、戻り値と失敗の理由が記載されています (または、GetLastError から取得できることが示されています)。

于 2013-06-24T22:15:01.530 に答える