在编译时修改EXE中的版本信息

时间:2018-02-06 21:31:23

标签: delphi version delphi-7

我的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的值时,它仍然是"测试"而不是"驴"如预期的那样。

我做错了什么?如何使用编译开关更改版本信息?

1 个答案:

答案 0 :(得分:1)

正如Remy Lebeau所述(以及与Ken White相关的答案),版本信息应仅包含在一个来源中。这可以在项目属性中手动输入,也可以在VERSIONINFO资源中链接,但不能同时在两者中输入。如果您尝试同时执行这两项操作,则会发生冲突,或者链接的VERSIONINFO资源将删除手动输入的详细信息。

你不能:

  • 在项目属性中包含手动输入的版本信息
  • 并稍后更新部分版本信息(使用.rc文件)

手动输入的版本信息有局限性。解决方案是完全控制版本信息以解决您的问题。 This answerKen linked to应提供足够的信息以帮助您入门。