【发布时间】:2021-11-29 11:44:44
【问题描述】:
我正在使用下面的函数从当前的 EXE 文件中获取版本信息。
问题是,在应用 Delphi 11 的十一月补丁后,该函数开始使应用程序崩溃。
我的代码如下所示。崩溃的行是这样的:
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
这是错误,在此之后应用程序关闭。在补丁之前,同样的功能没有问题。也许是一个错误的更新?
function TForm1.version : string;
var
VerInfoSize: DWord;
VerInfo: Pointer;
VerValueSize: DWord;
VerValue: PVSFixedFileInfo;
Dummy: DWord;
sfilename: string;
begin
sfilename := paramstr(0);
VerInfoSize := GetFileVersionInfoSize(pchar(sfilename), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(pchar(sfilename), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
Result := inttostr(dwFileVersionMS shr 16);
Result := Result + '.' + inttostr(dwFileVersionMS and $FFFF);
Result := Result + '.' + inttostr(dwFileVersionLS shr 16);
Result := Result + '.' + inttostr(dwFileVersionLS and $FFFF);
end;
FreeMem(VerInfo, VerInfoSize);
end;
【问题讨论】:
-
你不做任何错误检查。所以也许这些 API 调用失败了。检查 API 函数的返回值是否有错误。文档告诉您如何指示错误。
-
将大小传递给
FreeMem也很奇怪。你不应该那样做。 -
@DavidHeffernan 是正确的,可能的原因是缺乏错误检查。除此之外,你的确切代码适用于我修补的 Delphi 11。
-
另一个问题..为什么你有这个功能作为
TForm1类的一部分。它可以是独立的功能。 -
问题的答案在检索版本信息时会进行错误检查:stackoverflow.com/questions/17279394/…
标签: delphi delphi-11-alexandria