小编KAd*_*dot的帖子

进程外COM服务器卡住了

我使用的是进程外COM服务器(使用DECLARE_CLASSFACTORY_SINGLETON实现的COM单例"引擎"),它在STA(CComSingleThreadModel,_ATL_APARTMENT_THREADED)中工作.

COM服务器客户端:

  1. ActiveScript(JScript),(我使用AddNamedItem传递Engine引用).
  2. 两个独立的IE BHO.

BHO定期调用Engine :: dispatchEvent,Engine调用ActiveScript的JavaScript函数.这种架构非常有效,直到我同时打开两个BHO.

如果我打开两个BHO,当我调用ActiveScript函数(使用IDispatch/Invoke)时会发生卡住.我没有创建任何额外的线程.

一些说明:

  • 如果我没有将从BHO检索到的对象传递给ActiveScript(或者用在Engine中创建的相同对象替换它),一切正常.
  • 仅当JScript垃圾收集器尝试释放从BHO检索到的对象(callstack中的IUnknown_Release_Proxy)时才会发生Stuck.

调用堆栈:

>    ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes    
 ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes    
 KernelBase.dll!_WaitForMultipleObjectsEx@20()  + 0x100 bytes    
 kernel32.dll!_WaitForMultipleObjectsExImplementation@20()  + 0x8e bytes    
 user32.dll!_RealMsgWaitForMultipleObjectsEx@20()  + 0xe2 bytes    
 ole32.dll!CCliModalLoop::BlockFn(void * * ahEvent, unsigned long cEvents, unsigned long * lpdwSignaled)  Line 1222    C++
 ole32.dll!ModalLoop(CMessageCall * pcall)  Line 211    C++
 ole32.dll!ThreadSendReceive(CMessageCall * pCall)  Line 4979    C++
 ole32.dll!CRpcChannelBuffer::SwitchAptAndDispatchCall(CMessageCall * * ppCall)  Line 4454 + 0x6 bytes    C++
 ole32.dll!CRpcChannelBuffer::SendReceive2(tagRPCOLEMESSAGE * pMessage, unsigned long * pstatus)  Line 4076    C++ …
Run Code Online (Sandbox Code Playgroud)

windows com atl marshalling active-script

15
推荐指数
1
解决办法
1854
查看次数

标签 统计

active-script ×1

atl ×1

com ×1

marshalling ×1

windows ×1