我已经构建了一个带有VERSIONINFO资源的Win32可执行文件(详见下文),当从两台不同的计算机上检查时,它提供了不同的版本信息。
exe文件保存在共享驱动器上,所以我有理由相信它确实是同一个文件。
机器A是我的64位运行Windows 7企业版的开发计算机。它是构建可执行文件的地方。在机器A上,我得到了我期待的东西,在Windows资源管理器中,它给了我这个:
请注意,版本字符串中有一个内部版本号217,这是我的构建过程设置的内容。
我也可以使用Powershell查询此信息。我想在控制部署的脚本中执行此操作:
PS D:\> (get-item \\S030A2787\EdiProcessor\Build
\EDIProcessor.Service.exe).VersionInfo | Select-Object *
Comments : Build 217
CompanyName : ********
FileBuildPart : 0
FileDescription : EDIProcessor.exe
FileMajorPart : 1
FileMinorPart : 0
FileName : \\S030A2787\EdiProcessor\Build\EDIProcessor.Service.exe
FilePrivatePart : 217
FileVersion : 1.0.0.217
InternalName : EDIProcessor
IsDebug : False
IsPatched : False
IsPrivateBuild : False
IsPreRelease : False
IsSpecialBuild : False
Language : Englisch (USA)
LegalCopyright :
LegalTrademarks :
OriginalFilename :
PrivateBuild :
ProductBuildPart : 0
ProductMajorPart : 1
ProductMinorPart : 0
ProductName : EDIProcessor
ProductPrivatePart : 217
ProductVersion : 1.0.0.217
SpecialBuild :
PS D:\> $PSVersionTable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.16406
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
计算机B是运行Windows Server 2012 R2的虚拟机。这是我将可执行文件部署到的地方,在这里我获得了不同的意外输出。 B上的Windows资源管理器说:
请注意,除了使用其他语言之外,版本字符串显示为1.0.0.0而没有build-number。 Powershell同意:
PS Y:\> (get-item \\S030A2787\EDIProcessor\build\EDIProcessor.Service.exe).VersionInfo | Select-Object *
Comments :
CompanyName :
FileBuildPart : 0
FileDescription : EDIProcessor.Service
FileMajorPart : 1
FileMinorPart : 0
FileName : \\S030A2787\EDIProcessor\build\EDIProcessor.Service.exe
FilePrivatePart : 0
FileVersion : 1.0.0.0
InternalName :
IsDebug : False
IsPatched : False
IsPrivateBuild : False
IsPreRelease : False
IsSpecialBuild : False
Language : English (United States)
LegalCopyright :
LegalTrademarks :
OriginalFilename :
PrivateBuild :
ProductBuildPart : 0
ProductMajorPart : 1
ProductMinorPart : 0
ProductName : EDIProcessor.Service
ProductPrivatePart : 0
ProductVersion : 1.0.0.0
SpecialBuild :
PS Y:\> $PSVersionTable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.18773
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
有问题的可执行文件是用于Win32平台的Embarcadero Delphi 10.2内置的Windows服务。我通过编写VersionInfo.rc添加了这个版本信息,如下所示:
#define VERSION 1,0,0,217
#define VERSION_STR "1.0.0.217\0"
#define COMMENT "Build 217\0"
1 VERSIONINFO
FILEVERSION VERSION
PRODUCTVERSION VERSION
FILEFLAGSMASK 0x0
FILEFLAGS 0x0
FILEOS 0x4
FILETYPE 0x1
FILESUBTYPE 0x0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "Comments", COMMENT
VALUE "ProductName", "EDIProcessor\0"
VALUE "CompanyName", "********\0"
VALUE "InternalName", "EDIProcessor\0"
VALUE "FileDescription", "EDIProcessor.exe\0"
VALUE "FileVersion", VERSION_STR
VALUE "ProductVersion", VERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409L, 1252
VALUE "Translation", 0x0407L, 1252
END
END
将RC文件添加到项目中。显然,在源代码管理结账时,相应地设置了顶部的#defines。构建时我可以看到资源编译器被调用,并且在开发机器上一切都很好。
有人能告诉我为什么两台机器以完全不同的方式解释同一个可执行文件的VERSIONINFO?难道我做错了什么?当然最重要的是:我该怎么做才能解决这个问题?
感谢您阅读本文,感谢您更多地考虑我的问题。