【问题标题】:Delphi XE2: EResNotFound exception "Resource "<mainform>" not found" raised on some target machines but not on othersDelphi XE2:在某些目标机器上引发了 EResNotFound 异常“资源“<mainform>”,但在其他机器上没有
【发布时间】:2012-05-19 23:14:45
【问题描述】:

过去两天我一直在努力解决这个问题,似乎无法取得任何进展......

几乎每时每刻,Delphi XE2 都无法正确编译我的一个项目。也就是说,它实际上编译时没有错误,但在运行时我得到资源未找到错误,因为它本质上是主要的“表单”(在这种情况下它实际上是一个数据模块)。我已经从源代码控制恢复到项目的旧版本,我知道这些版本肯定可以正常工作,但无济于事。由此看来,它似乎一定是 Delphi/IDE 本身内部的东西,而不是项目源代码中的东西。但是,我也无法通过一个简单的测试项目或任何其他现实项目来重现该问题......它只发生在这个项目中。

另一个奇怪的事情是,当我使用 XN Resource Explorer 查看生成的二进制文件时,一切看起来都应该是:错误消息中提到的表单资源实际上是存在的并且完好无损...

在某些时候,我怀疑这可能是由我在 IDE 中安装的专家之一(例如 Uwe 的平台和 OI 专家和 VersionInsightPlus、Andreas 的 IDEFixPack 和 DDevExtensions、GExperts)的错误引起的,但即使在禁用所有这些问题仍然存在。

不幸的是,我无法准确追踪何时开始发生这种情况,因为我已经工作了一段时间而没有实际运行二进制文件、修复 x64 目标的编译器警告和错误、调整更新的第三方的构建事件工具(本地化和许可保护)等等......

有没有人见过这样的事情发生?有关如何确定这一点的更多想法?


有关该项目的更多详细信息:

  • 它是使用 Add-In-Express 框架(即 COM-DLL)构建的 Outlook 插件。
  • “主窗体”是TDataModule-descendant - 我们还将自己的祖先类插入到层次结构中,即“插件模块”不直接继承自TadxCOMAddInModule - 自定义祖先窗体的资源使用资源查看器检查时,输出二进制文件中似乎也存在且完好无损。
  • 没有为 Win32 和 Win64 平台构建的运行时包。

如果您认为我没有提及任何其他可能相关的细节,请告诉我。

更新: 我现在已将有问题的来源转移到另一台机器上。有趣的是,我在那里编译的 DLL 没有出现问题 - 在那台机器上......当我将它转移回原始机器并尝试调用它时,错误又回来了(强调这一点:这是确切的同一个 DLL 在一台机器上产生EResNotFound 而在另一台机器上却没有。当然,一旦我发现了这一点,我也进行了反向测试,你瞧,在原始机器上编译的 DLL 在另一台机器上运行没有错误... 看来这毕竟不是 Delphi 问题……但那是什么?

两台机器的区别:

  • 机器 1(出现问题的机器):Windows 7 Ultimate English 64bit with Delphi XE2 Update 4
  • 机器 2:Windows 7 Professional German 32bit with Delphi XE2 Update 3

在几乎与第一台相同的第三台机器上,除了没有 Delphi 之外,两台机器生成的 DLL 都可以完美运行。

【问题讨论】:

    标签: delphi resources delphi-xe2 regression


    【解决方案1】:

    在这里看到你的问题我有点惊讶。 :)

    我们在最近的 Delphi XE2 更新 4 中遇到了许多严重问题。尽管我们从未遇到或报告过“找不到资源”错误,但我认为此更新可能是原因之一。你安装了吗?

    我想到的另一件事是用于 Office 控件(命令栏和功能区)的图像。可能它们以某种方式损坏了,运行时代码无法加载它们并报告此错误。

    无论如何,如您所知,这些只是我的猜测,如果您在 Office 插件方面需要我们的帮助,请联系 Add-in Express 支持服务,我们会尽力提供帮助。

    【讨论】:

    • Dmitry,好吧,我认为这不是 ADX 特有的问题。否则我会在论坛上问。但是,我有一些新的细节。我现在正在将它们添加到问题中......
    【解决方案2】:

    更新:似乎我有点太快了,得出结论。显然,Sisulizer 解决方案也应该执行回退到主资源块。我现在已将此问题提交给product forum,一旦解决,我会在这里报告。


    好了,谜底终于解开了:

    我在Sisulizer 中关闭了“复制所有资源”选项,试图减小生成的资源 DLL 的大小,然后忘记了它...

    我还没有完全意识到标准 Delphi 资源 DLL 方法对 Sisulizer “搭载”的本地化的影响 - 特别是这是一个孤注一掷的交易:我们之前的翻译解决方案实现了一个后备机制,该机制将而是从主机二进制文件中读取在外部资源 DLL 中找不到的任何资源。 Sisulizer 似乎不是这种情况 - 至少不是开箱即用的......因此,就应用程序而言,本地化资源 DLL 中不包含的任何资源都不存在。
    我也没有意识到仅仅存在与主二进制文件具有相同基本名称的文件和与当前系统默认语言环境匹配的扩展名(例如.EN.DE)会自动导致 VCL 加载它...

    没有出现错误的机器要么仍然有旧的、更大的(=完整的)资源 DLL,要么根本没有资源 DLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多