编译时修改EXE中的版本信息
Modify version information in EXE at compile time
我的 Delphi 7 应用程序在 Delphi IDE 项目属性中选择了 Include version information in project
。我想在编译时根据定义修改其中一个版本信息字段(例如InternalName
)。
在项目属性中,我手动将 InternalName
设置为字符串 "Test"。然后我调用这段代码:
function GetSpecificFileVersionInfo(szFile: PChar; strInfo: String) : String;
var
pstrBuffer: PChar;
dwSize, dwLength: DWORD;
pVersion: pointer;
strKey: String;
begin
// Return the specified file version information
// Adapted from: http://www.swissdelphicenter.com/en/showcode.php?id=1047
Result := '';
dwSize := GetFileVersionInfoSize(szFile, dwSize);
if (dwSize > 0) then
begin
pstrBuffer := AllocMem(dwSize);
try
if ( (GetFileVersionInfo(szFile, 0, dwSize, pstrBuffer)) and
(VerQueryValue(pstrBuffer, '\VarFileInfo\Translation', pVersion, dwLength))) then
begin
strKey := Format('\StringFileInfo\%.4x%.4x\%s', [
LoWord(Integer(pVersion^)),
HiWord(Integer(pVersion^)), strInfo]);
if (VerQueryValue(pstrBuffer, PChar(strKey), pVersion, dwLength)) then
Result := StrPas(pVersion);
end;
finally
FreeMem(pstrBuffer, dwSize);
end;
end;
end;
像 strVersion := GetSpecificFileVersionInfo('MyEXE.exe', 'InternalName');
这样的电话
这 returns "Test" 符合预期。到目前为止一切都很好。现在我创建以下 Version.rc 文件(试图更改 InternalName
的值):
// Version information resource file
VS_VERSION_INFO VERSIONINFO
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
// Note: Block "080904b0" was also tried with the same results
BEGIN
VALUE "InternalName", "Donkey"
END
END
END
编译(使用 Microsoft 资源编译器,rc.exe)为 Version.res。然后在编译时链接到应用程序(基于我的编译标志),放置在项目 .dpr 文件中:
{$IFDEF ALT_LANG}
{$R 'source\Version.res'}
{$ENDIF}
这一切似乎都可以正确编译...但是当我检查 InternalName
的值时,它仍然是 "Test" 而不是预期的 "Donkey"。
我做错了什么?如何使用编译开关更改版本信息?
如 Remy Lebeau 所述(以及 Ken White 链接的答案)版本信息应仅包含一个来源。这可以在项目属性中手动输入,也可以通过链接 VERSIONINFO 资源来输入,但不能同时进行。如果您尝试同时执行这两种操作,您将遇到冲突,或者链接的 VERSIONINFO 资源将删除手动输入的详细信息。
你不能:
- 在您的项目属性中包含手动输入的版本信息
- 稍后更新部分版本信息(使用.rc文件)
手动输入的版本信息有限制。解决方案是完全控制版本信息来解决您的问题。 and the one Ken linked to 应该提供足够的信息让你开始。
我的 Delphi 7 应用程序在 Delphi IDE 项目属性中选择了 Include version information in project
。我想在编译时根据定义修改其中一个版本信息字段(例如InternalName
)。
在项目属性中,我手动将 InternalName
设置为字符串 "Test"。然后我调用这段代码:
function GetSpecificFileVersionInfo(szFile: PChar; strInfo: String) : String;
var
pstrBuffer: PChar;
dwSize, dwLength: DWORD;
pVersion: pointer;
strKey: String;
begin
// Return the specified file version information
// Adapted from: http://www.swissdelphicenter.com/en/showcode.php?id=1047
Result := '';
dwSize := GetFileVersionInfoSize(szFile, dwSize);
if (dwSize > 0) then
begin
pstrBuffer := AllocMem(dwSize);
try
if ( (GetFileVersionInfo(szFile, 0, dwSize, pstrBuffer)) and
(VerQueryValue(pstrBuffer, '\VarFileInfo\Translation', pVersion, dwLength))) then
begin
strKey := Format('\StringFileInfo\%.4x%.4x\%s', [
LoWord(Integer(pVersion^)),
HiWord(Integer(pVersion^)), strInfo]);
if (VerQueryValue(pstrBuffer, PChar(strKey), pVersion, dwLength)) then
Result := StrPas(pVersion);
end;
finally
FreeMem(pstrBuffer, dwSize);
end;
end;
end;
像 strVersion := GetSpecificFileVersionInfo('MyEXE.exe', 'InternalName');
这 returns "Test" 符合预期。到目前为止一切都很好。现在我创建以下 Version.rc 文件(试图更改 InternalName
的值):
// Version information resource file
VS_VERSION_INFO VERSIONINFO
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
// Note: Block "080904b0" was also tried with the same results
BEGIN
VALUE "InternalName", "Donkey"
END
END
END
编译(使用 Microsoft 资源编译器,rc.exe)为 Version.res。然后在编译时链接到应用程序(基于我的编译标志),放置在项目 .dpr 文件中:
{$IFDEF ALT_LANG}
{$R 'source\Version.res'}
{$ENDIF}
这一切似乎都可以正确编译...但是当我检查 InternalName
的值时,它仍然是 "Test" 而不是预期的 "Donkey"。
我做错了什么?如何使用编译开关更改版本信息?
如 Remy Lebeau 所述(以及 Ken White 链接的答案)版本信息应仅包含一个来源。这可以在项目属性中手动输入,也可以通过链接 VERSIONINFO 资源来输入,但不能同时进行。如果您尝试同时执行这两种操作,您将遇到冲突,或者链接的 VERSIONINFO 资源将删除手动输入的详细信息。
你不能:
- 在您的项目属性中包含手动输入的版本信息
- 稍后更新部分版本信息(使用.rc文件)
手动输入的版本信息有限制。解决方案是完全控制版本信息来解决您的问题。