0

我正在为 Excel 开发一个 Delphi 插件。它还使用 AddIn Express COM 库(优秀的 BTW)。代码一直运行良好。我添加了另一个功能区菜单选项,它调用了一个新表单。此表单具有 REST 控件(客户端、响应等)。虽然这些组件相互关联,但它们没有关于 URL 的信息。这是在运行时设置的。我编译我的项目。

  • 如果我独立运行它(在调试器之外),它运行良好。它设置 URL 资源、调用 REST 服务并在备忘录中显示数据。
  • 如果我从 Delphi 中运行它,我会立即转储到汇编代码中,并在事件日志中收到错误消息

    “尝试在 OS Loader Lock 内进行托管执行。不要尝试在 DllMain 或图像启动函数中运行托管代码,因为这样做会导致应用程序挂起。”

这曾经运行良好,但我刚刚添加了一个表单(具体来说,我添加了一个父表单,带有 REST 组件、一个 RestAdapter、TDatasource 和 ClientDataSet,并从它继承)。在谷歌搜索中,这似乎是一个调试器问题,并且(至少在 Visual Studio 中),这可以通过 Exceptions / Ignore Loader Lock 关闭。我在 Delphi (Seattle) 调试器中找不到任何类似的功能。

我运行 AddIn express 没有问题,我的插件过去运行没有问题,我运行独立的 REST 演示应用程序没有问题。组合是否可能导致此问题?知道如何禁用调试器检查加载程序锁吗?如果有帮助,事件日志中“OS Loader Lock”消息之前的最后一条消息显示模块:CSCAPI.dll 已加载。我想知道是否需要动态创建 REST 组件。我的怀疑是这些组件是在应用程序(也就是我的插件的 Excel)启动时创建的,并且正在以一种使调试器不安的方式初始化某些东西......

4

2 回答 2

0

我终于解决了发生的事情。我已经购买并安装了另一个 Excel 插件。这是导致我的问题的原因。显然,它在其初始化例程中使用了导致我的问题的代码。一旦我将该插件设置为非活动状态,我的代码就可以正常工作。这根本不是 REST 组件的问题。

于 2016-09-07T11:34:10.130 回答
0

可能的解释是您的一个initialization单元中的某些代码是负责任的。这段代码是从DllMain函数中调用的。尝试托管执行DllMain确实是在自找麻烦。

在我的 AddInExpress 模块中,所有initialization部分都是空的。任何初始化都在别处执行。我知道这似乎令人沮丧,但你真的不能在你的DllMain.

我建议您的下一步是删除代码,直到您找到initialization负责的部分。请注意,您项目中的任何单元都可能负责,甚至是 Embarcadero 库代码,例如您使用的 Embarcadero REST 组件。那是你的出发点。至于解决方案,请考虑一旦您隔离了问题。

于 2016-09-05T16:46:24.120 回答