我在客户环境中有一个非常奇怪的问题 - 我有一个调用3或4个进程内COM对象(dll)的exe。这些dll也相互调用和主exe(通过COM事件)。
这项工作很长时间(5年?)并继续在数千台机器上正常工作,但对于一个客户(Windows 2008 R2),整个系统变得混乱:主要的exe创建一个简单的香草公寓线程COM使用CoCreateInstance并开始调用其方法的对象(无自定义编组)。
一切都可以正常运行几十个或一百个调用,但随后发生了一些真正意想不到的事情:对一个进程内COM对象(实际上是COM返回的代理)的调用被编组到一个单独的线程创建由COM。该方法回调主exe,但调用再次被编组到另一个线程。并且该线程上的代码开始访问控件,这就是当真正糟糕的事情开始发生时 - 主线程被阻塞,并且从辅助线程块访问主线程上创建的控件(SentMessage,GetPropW等)。
有人见过这个吗?
有没有办法可以完全禁用此行为或完全摆脱COM编组(在这种情况下这是没用的,因为我的应用程序没有创建线程)?
我用自己的函数替换了CoCreateInstance(),给定类GUID,计算可执行路径,加载它,调用DllgetClassObject,然后调用IClassFactory :: CreateObject。这完全正常,我的所有对象现在都在主线程上运行。但是,out-of-proc对象(我的CoCreateInstance版本没有触及)也会因非常相似的错误而失败:我创建一个Outlook.Application对象的实例,然后创建一个新的MailItem对象。现在返回访问该对象上的任何属性 '应用程序称为为不同线程编组的接口'。它不是!我在创建对象时记录了线程id。所有的电话都在主线上!
帮助!我该如何制止这种疯狂?
谢谢!