我已经编程了一段时间,关于 COM/ActiveX 对象,我面临着非常奇怪的问题,这显然超出了我的知识范围。 这里是。 我的软件使用后期绑定(bind)与 COM 对象通信。 由于这些 COM 对象与硬件(例如科学相机)通信,因此我选择将所有调用序列化到专用线程中。这允许主线程与用户交互。 因此,我将消息从主用户线程(或任何其他线程)发送到专门处理 activeX 的线程。
这是它的样子
<小时/>procedure MythreadActiveX.execute; begin CoInitialize(nil); Try ComObject :=CreateOLEObject(COMID); While not Terminated do Begin If PeekMessage(Msg,0,0,0,PM_REMOVE) then Begin TranslateMessage(Msg); DispatchMessage (Msg); end; If (FEvent.WaitFor(TimOutMs)=wrSignaled) then // Wait for command Begin FEvent.ResetEvent; Try Case COM_Order of Oder1:Begin ......... end Oder2:Begin ......... end end; FEventComplete.SetEvent; end; end; CoUnInitialize; end;
这对大多数 COM 服务器来说都是一种魅力,但对其他 COM DLL/服务器来说却失败了,特别是用 Visual Basic 编写的,我注意到进程资源管理器中的 ActiveX 代码被执行到主线程中,尽管我做了什么多于 ! 结果导致 - 主线程保持不变 - 主线程内存损坏(例如大数组)...==我的应用程序崩溃
是什么原因造成的?这与 ActiveX 线程模型有关吗? 我想理解并更正我的代码以应对这种情况(在这种情况下,COM 应在主线程中运行......)
谢谢 (因为我花了时间在这上面,所以我准备提供更多信息以便理解)
最佳答案
使用 CoInitializeEx(nil,COINIT_MULTITHREADED) 比 CoInitialize 更好...因为 COM 对象被分派(dispatch)到主线程中。
关于multithreading - Delphi COM 对象多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348867/