【发布时间】:2014-12-04 23:10:43
【问题描述】:
我正在将程序从 Delphi 2010 更新到 Delphi XE7。由于我认为需要适应 unicode 并使用 GetFileVersionInfoW 而不是 GetFileVersionInfoSize,所以下面显示的代码已停止工作。
有没有人开发了我正在使用的函数的更新版本,如下所示?到目前为止,我在网上找不到任何示例,恐怕低级 Windows 编程有点超出我的能力。
感谢您的帮助!
下面的旧代码不再适用于 Delphi XE2 及更高版本:仅返回 1.0.0.0
procedure GetBuildInfo(var V1, V2, V3, V4: Word);
{From Steve Schafer }
var
VerInfoSize: DWORD;
VerInfo: pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', pointer(VerValue), VerValueSize);
with VerValue^ do
begin
V1 := dwFileVersionMS shr 16;
V2 := dwFileVersionMS and $FFFF;
V3 := dwFileVersionLS shr 16;
V4 := dwFileVersionLS and $FFFF;
end;
FreeMem(VerInfo, VerInfoSize);
end;
【问题讨论】:
-
你确定你的应用。不是版本 1.0.0.0 吗?顺便提一句。您绝对应该添加一些错误检查。
-
您发布的代码在 XE6 中的新 VCL 应用程序中运行良好。在表单上放置一个标签,转到项目选项并设置构建的版本信息,使用这两行(以及适当的变量声明)为 FormShow 添加一个处理程序: GetBuildInfo(Major, Minor, Rev, Build); Label1.Caption := Format('%d.%d.%d.%d', [Major, Minor, Rev, Build]); Project->Build(获取添加的版本信息,并运行应用程序。在我的情况下,我将版本设置为 4.3.2.1,标签显示
4.3.2.1。 -
代码在所有版本的 Delphi 上工作方式完全相同。缺少错误检查并不理想。
-
RTL 映射 Win32 API 函数以匹配用于
(P)Char的数据类型。因此,GetFileVersionInfoSize()和GetFileVersionInfo()实际上在 Delphi 2007 和更早版本中映射到GetFileVersionInfoSizeA()和GetFileVersionInfoA(),在 Delphi 2009 和更高版本中映射到GetFileVersionInfoSizeW()和GetFileVersionInfoW()。这就是为什么此代码无需任何修改即可在每个 Delphi 版本中运行的原因。 -
个人在获取调用app自己的版本号时,我更喜欢直接加载版本资源,而不是使用
GetFileVersionInfo():stackoverflow.com/a/13942403/65863
标签: delphi unicode delphi-2010 delphi-xe7