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;
基于堆栈回复Get FileVersion with Build
它在大多数情况下都有效。
谢谢
最佳答案
您没有检查 GetFileVersionInfoSize
的返回值。如果文件名无效或没有可用的版本信息,它将返回零(错误),并且文档说您可以找出使用 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 获取)。
关于delphi - GetFileVersionInfoSize 和 GetFileVersionInfo 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279394/