我的Delphi 7应用程序在Delphi IDE项目属性中选择了Include version information in project
。我想在编译时根据定义修改其中一个版本信息字段(例如InternalName
)。
在项目属性中,我手动将InternalName
设置为字符串"测试"。然后我调用这段代码:
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');
这将返回"测试"正如所料。到目前为止都很好。现在我创建以下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
的值时,它仍然是"测试"而不是"驴"如预期的那样。
我做错了什么?如何使用编译开关更改版本信息?
答案 0 :(得分:1)
正如Remy Lebeau所述(以及与Ken White相关的答案),版本信息应仅包含在一个来源中。这可以在项目属性中手动输入,也可以在VERSIONINFO资源中链接,但不能同时在两者中输入。如果您尝试同时执行这两项操作,则会发生冲突,或者链接的VERSIONINFO资源将删除手动输入的详细信息。
你不能:
手动输入的版本信息有局限性。解决方案是完全控制版本信息以解决您的问题。 This answer和Ken linked to应提供足够的信息以帮助您入门。