Delphi - OS加载器锁定问题突然出现在Excel

时间:2016-09-05 15:53:09

标签: .net rest delphi com loaderlock

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

可能的解释是,您initialization个单位中的某些代码负责。此代码从DllMain函数调用。尝试从DllMain执行托管执行确实是在寻找麻烦。

在我的AddInExpress模块​​中,所有initialization部分都是空的。任何初始化都在别处执行。我知道这会让人感到沮丧,但你真的不能在DllMain中做任何复杂的事情。

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

答案 1 :(得分:0)

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