【发布时间】:2013-08-24 09:58:17
【问题描述】:
我已经编程了一段时间,关于 COM/ActiveX 对象,我面临着非常奇怪的问题,这显然超出了我的知识范围。 这里是。 我的软件使用后期绑定与 COM 对象对话。 由于这些 COM 对象与硬件(例如科学相机)对话,因此我选择将所有调用序列化到一个专用线程中。这允许主线程与用户交互。 所以我将消息从主用户线程(或任何其他线程)发送到专门用于处理 activeX 的线程。
这里的样子
过程 MythreadActiveX.execute; 开始 CoInitialize(nil); 尝试 ComObject :=CreateOLEObject(COMID); 虽然没有终止做 开始 如果 PeekMessage(Msg,0,0,0,PM_REMOVE) 那么 开始 翻译消息(消息); 调度消息(消息); 结尾; If (FEvent.WaitFor(TimOutMs)=wrSignaled) then // 等待命令 开始 FEvent.ResetEvent; 尝试 案例 COM_Order of Oder1:开始 ………… 结尾 Oder2:开始 ………… 结尾 结尾; FEventComplete.SetEvent; 结尾; 结尾; 联合初始化; 结尾;
这对大多数 COM 服务器来说就像一个魅力,但在其他 COM DLL/服务器上却失败了,尤其是用 Visual Basic 编写的,我注意到进程资源管理器尽管我做了什么,但 ActiveX 代码被执行到主线程中以上 ! 结果导致 - 主线程保持 - 主线程内存损坏(例如大数组)... == 我的应用程序崩溃
原因是什么?这与 ActiveX 线程模型有关吗? 我想了解并纠正我的代码以应对这种情况(在这种情况下,COM 将在主线程中运行....)
谢谢 (由于我花时间在这方面,我准备提供更多信息以便理解)
【问题讨论】:
-
我注意到进程资源管理器尽管我在上面做了什么,但 ActiveX 代码仍被执行到主线程中 - 不确定我是否正确。您如何知道 COM server 代码在您的应用程序主 client 线程上执行?我建议在可能的情况下添加一些OutputDebugString 显示GetCurrentThreadId。您可以使用DebugView 来调试输出。
-
我正在使用processexplorer,这是一个非常有效的工具。
标签: multithreading delphi com