【问题标题】:Compiling .rc file inline内联编译 .rc 文件
【发布时间】:2015-09-15 14:20:04
【问题描述】:

我正在使用 Delphi XE4,并试图实现 32/64 位兼容性,为此我需要在资源上存储 2 个 DLL(一个 32 另一个 64),导出它们,如果可执行文件检测到 64 位操作系统,它将使用 64 位 DLL。但我想包含这个资源,只有在编译 32 位版本的可执行文件时,所以我试图得到这样的东西:

{$IFDEF WIN32}
{$R Resources.res Resources.rc}
{$ENDIF}

我不知道它是否正确,因为我无法测试,这行: {$R Resources.res Resources.rc} 不像我预期的那样工作。

如果我删除 Resources.res 文件,它会给我错误

[dcc32 错误] E1026 文件未找到:'Resources.res'

如果我留下一个预编译的 .res 文件,它在构建/编译时不会刷新,即使我更改了我的 .rc 文件(例如删除其中一个 DLL),exe 仍然获得相同的大小,所以我相信它没有刷新 .res 文件...

我的 .rc 文件是:

X86RES RCDATA x86.dll
X64RES RCDATA x64.dll

如何获取这个 rc 文件,编译成资源,只有在编译为 32 位环境时?

【问题讨论】:

  • 我相信您正在寻找WIN32WIN64。您还必须将脚本分开 - 一个用于 32,另一个用于 64。
  • 你的意思是什么脚本?
  • 我的意思是 .rc 脚本文件应该是 2 个文件 - 然后使用 WIN32WIN64 有条件地包含一个或另一个。
  • 您是否要将 DLL 加载到提取它们的进程中?在这种情况下,您可以期待反恶意软件对您的行为采取模糊的看法。
  • 不知道这是否重要,但 IIRC {$R xxx.res xxx.rc } 方案仅适用于项目文件(dpr 或 dpk)。

标签: delphi delphi-xe4


【解决方案1】:
  • 创建两个 .rc 文件。一个用于 32 位 DLL,一个用于 64 位 DLL。
  • 将两个资源文件编译为 .res 文件。
  • 对于 32 位构建,仅链接包含 32 位 DLL 的 .res 文件。
  • 对于 64 位版本,链接两个 .res 文件。

就我个人而言,我不太喜欢让 IDE/编译器来编译我的资源。我喜欢在预构建脚本中这样做。但这主要是个人喜好。

值得指出的是,当您编译项目时,IDE/编译器不会重新编译资源脚本。仅当您进行构建或删除已编译的 .res 文件时,才会重新编译资源脚本。

这也是我喜欢负责编译资源的原因之一。另一个是我可以选择使用的资源编译器,这在 Embarcadero 资源编译器不足的情况下可能很重要。


从 cmets 判断,您有一个我在上面描述的更复杂的场景。但是,基本情况保持不变。通过在资源文件和可执行模块之间建立一对一的关联,您可以获得灵活性。这种灵活性使您可以准确地链接您希望的模块,仅此而已。

【讨论】:

  • 只是一些问题:我将如何链接 32 位构建一个 .res 和 64 位构建另一个 .res?我的意思是,自动。我怎样才能自动编译两个 .res 呢?如果我打算只有一个最终的 exe(32 位)应该导出 64 位 exe 和两个 dll,那么这一切将如何工作?
  • 我认为使用一个 exe(32 位)和一个 .rc 文件,其中包含 3 个资源(32dll、64dll、64exe)要容易得多,所以我将它们全部编译为 .res 和提取它们,如果 32 位 exe 检测到 64 位操作系统,则运行加载 64 位 .dll 的 64 位.exe ......所有这些都在同一个 exe 和同一个 rc 文件中。唯一的问题是在 64 位版本中也链接这个 rc 文件是没有意义的,这就是整个问题,我可以手动删除/添加它,但是 IDE 不能处理这个吗?
  • 在我看来,您似乎已经决定了解决方案。在这种情况下,我不确定你为什么要征求意见。您想知道如何将不同的东西放在不同的可执行文件中。我给你一个方法。你拒绝了,并说你宁愿把它们都放进去,然后再把它们中的一些去掉。好吧,我不会那样做,但这是你的选择。
  • FWIW,我看不出在其他可执行文件中嵌入可执行文件如何实现 32/64 位兼容性。
  • 在你给我的解决方案上,我需要 2 个 exes,32/64,对吧?但是让我们从可能会打开 exe 的人开始,不知道 32/64 位差异......所以我只需要提供一个 32 位(在所有机器上运行),而这个,如果需要,运行64位...但是要这样工作,看起来只是在编译64位版本时从项目中删除rc文件,并在编译32位版本时添加...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2021-08-02
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多