Windows 资源字段溢出到下一个字段

Posted

技术标签:

【中文标题】Windows 资源字段溢出到下一个字段【英文标题】:Windows resources field overflows to next field 【发布时间】:2022-01-01 17:02:06 【问题描述】:

我尝试使用 Borland 资源编译器构建资源文件,但是字段的数据必须溢出。即使我用空格填充 30 个字符,它在某些情况下也会溢出(在某些情况下不会)......是否有一些 Microsoft 资源文件的二进制格式描述?

这里是代码。

resource.rc文件:

VS_VERSION_INFO VERSIONINFO
FILEVERSION     1, 1, 1, 1
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        "VAR_COMPANYNAME"
            VALUE "FileDescription",    "VAR_FILEDESCRIPTION"
            VALUE "FileVersion",        "VAR_FILEVERSION"
            VALUE "InternalName",       "VAR_INTERNALNAME"
            VALUE "LegalCopyright",     "VAR_LEGALCOPYRIGHT"
            VALUE "LegalTrademarks1",   "VAR_LEGALTRAIDMARKS1"
            VALUE "LegalTrademarks2",   "VAR_LEGALTRAIDMARKS2"
            VALUE "OriginalFilename",   "VAR_ORIGNALFILENAME"
            VALUE "ProductName",        "VAR_PRODUCTNAME"
            VALUE "ProductVersion",     "VAR_PRODUCTVERSION"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 1033, 1252
    END
END

resource.bat文件:

@echo off

T:\bin\brcc32.exe -foTSEDO.res "C:\repos\gradlecpp\src\main\resources\resource.rc"

resource.ps1文件:

$ErrorActionPreference = "SilentlyContinue"

Remove-Item "TSEDO.rc"
Remove-Item "TSEDO.res"
Remove-Item "TSEDO.dll"

$ErrorActionPreference = "Stop"
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

$process = Start-Process `
    -NoNewWindow `
    -FilePath "$scriptPath\resources.bat" `
    -Wait `
    -PassThru
if ($process.ExitCode -ne 0) 
    "Error " + $process.ExitCode
    exit


$process = Start-Process `
    -NoNewWindow `
    -FilePath "T:\Bin\bpr2mak.exe" `
    -ArgumentList 'TSEDO.bpr -t..\template.bmk' `
    -Wait `
    -PassThru

if ($process.ExitCode -ne 0) 
    "Error " + $process.ExitCode
    exit


$process = Start-Process `
    -NoNewWindow `
    -FilePath "T:\bin\make.exe" `
    -ArgumentList '-fTSEDO.mak' `
    -Wait `
    -PassThru

if ($process.ExitCode -ne 0) 
    "Error " + $process.ExitCode
    exit


(Get-Item TSEDO.dll).VersionInfo.CompanyName
(Get-Item TSEDO.dll).VersionInfo.FileDescription
(Get-Item TSEDO.dll).VersionInfo.FileVersion
(Get-Item TSEDO.dll).VersionInfo.InternalName
(Get-Item TSEDO.dll).VersionInfo.LegalCopyright
(Get-Item TSEDO.dll).VersionInfo.LegalTrademarks1
(Get-Item TSEDO.dll).VersionInfo.LegalTrademarks2
(Get-Item TSEDO.dll).VersionInfo.OriginalFilename
(Get-Item TSEDO.dll).VersionInfo.ProductName
(Get-Item TSEDO.dll).VersionInfo.ProductVersion

这是 Borland utils 版本:

c:\repos\torgovayasystema\EDO>brcc32 -h
Borland Resource Compiler  Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.

这是构建脚本的输出:

PS C:\repos\torgovayasystema\edo> resources.ps1
Borland Resource Compiler  Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.
BPR2MAK C++Builder Project file to Makefile converter. Version 5.0
Copyright (C) 2000, Borland/Inprise Corporation

Loading project file
Loading template
Generating Makefile
.......................................MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
        T:\bin\..\BIN\ilink32 @MAKE0000.@@@
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Warning: Public symbol '_PATH_TO_SAVE_DIADOC_FILES' defined in both module C:\REPOS\TORGOVAYASYSTEMA\EDO\FMEDODOCOUT.OBJ
 and C:\REPOS\TORGOVAYASYSTEMA\EDO\FMEDODOCOUTSTATUS.OBJ
VAR_COMPANYNAME
VAR_FILEDESCRIPTION
VAR_FILEVERSION
VAR_INTERNALNAMEH↕☺LegalCopyright
VAR_LEGALCOPYRIGHTP¶☺LegalTrademarks1
VAR_ORIGNALFILENAME
VAR_PRODUCTNAME
VAR_PRODUCTVERSIOND

还有图形的:

我有Windows 7 SP1

【问题讨论】:

不需要在资源脚本中手动添加尾随空终止符吗? 我很难理解问题所在。具体目标是什么?预期的行为是什么?观察到的行为是什么? IInspectable,请接受我的哀悼。 A VS_VERSION_INFO 仅包含数据。您无法将任何类型的格式信息编码到其中,这似乎是您所追求的。如果我们能理解这个问题,这将有助于回答这个问题。用我之前评论的答案更新问题将是朝着这个目标迈出的一步。 【参考方案1】:

如 MSDN 的VERSIONINFO resource 示例所示,需要在每个本地化的BLOCK 中的每个字符串值的末尾添加一个空终止符,例如:

VS_VERSION_INFO VERSIONINFO
FILEVERSION     1, 1, 1, 1
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        "VAR_COMPANYNAME\0"
            VALUE "FileDescription",    "VAR_FILEDESCRIPTION\0"
            VALUE "FileVersion",        "VAR_FILEVERSION\0"
            VALUE "InternalName",       "VAR_INTERNALNAME\0"
            VALUE "LegalCopyright",     "VAR_LEGALCOPYRIGHT\0"
            VALUE "LegalTrademarks1",   "VAR_LEGALTRAIDMARKS1\0"
            VALUE "LegalTrademarks2",   "VAR_LEGALTRAIDMARKS2\0"
            VALUE "OriginalFilename",   "VAR_ORIGNALFILENAME\0"
            VALUE "ProductName",        "VAR_PRODUCTNAME\0"
            VALUE "ProductVersion",     "VAR_PRODUCTVERSION\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 1033, 1252
    END
END

【讨论】:

谢谢!我想念它...我认为有用于填充的空终止符....

以上是关于Windows 资源字段溢出到下一个字段的主要内容,如果未能解决你的问题,请参考以下文章

将光标自动从数字输入字段移动到下一个字段

不要将光标传递到下一个文本字段而不在第一个文本字段中输入值

如何在颤动中将焦点转移到下一个文本字段?

切换到下一个文本输入字段而不在 react-native 中关闭键盘

如何检查是不是所有字段都已填写? [C++,VS 2015,Windows 窗体]

按下回车键时如何将焦点移到下一个字段?