【问题标题】:Delphi COM objects multithreadingDelphi COM 对象多线程
【发布时间】: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


【解决方案1】:

使用 CoInitializeEx(nil,COINIT_MULTITHREADED) 比 CoInitialize 更好...因为 COM 对象被分派到主线程中。

【讨论】:

    【解决方案2】:

    CreateOLEObject 在内部使用CoCreateInstance,并且通过将dwClsContext 仅作为CLSCTX_LOCAL_SERVER 传递(所以没有CLSCTX_INPROC_SERVER),应该强制COM 将任何DLL 加载到特定的dllhost.exe 中。我这里没有工具可以自己尝试,但是通过额外的包装,这可能会解决您的问题。

    另见this question

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2011-07-19
    • 2011-09-22
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多