编译时修改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 应该提供足够的信息让你开始。