【问题标题】:Win32 how big custom resource can be?Win32自定义资源能有多大?
【发布时间】:2012-07-25 18:49:08
【问题描述】:

尝试创建类似于 SFX(自解压安装程序)的东西,我使用 Visual c++ 中的自定义资源将安装文件包含在一个 exe 中。当安装文件的大小超过 ~900 MB 时,链接器无法生成嵌入资源的 exe。奇怪的是,链接器确实生成了一个没有任何警告的 exe。生成的 exe 是一个静态链接的 MFC App(可执行文件的主应用程序)。但是,不包括任何资源。我在从控制台链接期间观察了 exe 大小。它之前显示 900 MB,最后下降到 2MB exe。如果我删除了一些文件(比如总大小为 500MB),则生成的 exe 一切正常,并且嵌入了所有资源。自定义资源是否有实际大小限制?请注意,可执行文件的最终大小约为 1GB,这比 2GB win32 应用程序可以解决的要小得多。所以我想知道这是 vc++ 2010 的错误还是功能?顺便说一句,我还使用了 /expectedoutputsize 技巧。但这无济于事,除非链接速度更快,预期输出大小更大。

【问题讨论】:

  • Win32 资源不是包含大量数据的好方法。只需将它附加到您的文件中,从已知偏移量(大于可执行文件本身)开始,然后使用通常的文件读取功能来访问它。
  • 另一种选择是将原始资源数据包含在目标文件中并将其链接。在 Linux/OS X 上,您可以使用 GNU objcopy 将二进制文件转换为目标文件,但我不确定你如何使用微软的工具在 Win32 上做到这一点。
  • 是的,对于海量数据,将二进制文件附加到 exe 更有意义。但是,我仍然认为这是 VC++ 2010 中的链接器错误。如果我与调试版本链接,问题就消失了!所以我尝试了一些链接器选项,似乎使用 /INCREMENTAL=yes 就可以了!

标签: c++ visual-studio-2010 winapi


【解决方案1】:

迟来的答案。可能对其他人有帮助。可能不是您问题的答案,但这可能是您问题的解决方案。检查“Bitrock 安装程序”。这也提供了自解压安装程序。我在许多部署项目中都成功地使用了它。

【讨论】:

    【解决方案2】:

    根据PECOFF Specification,资源数据条目的大小为4字节(IMAGE_RESOURCE_DATA_ENTRY.Size - 见winnt.h)

    Data RVA 字段指向的资源数据的大小(以字节为单位)。

    【讨论】:

      【解决方案3】:

      我已经回答了类似的答案here

      基本上将二进制+幻数(唯一分隔符)附加到可执行文件的末尾。在运行时打开可执行文件进行读取,通过幻数或其他方法找到偏移量,文件的其余部分就是您的大数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-21
        • 1970-01-01
        • 2022-09-27
        • 2023-04-01
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多