Delphi COM对象多线程

Delphi COM对象多线程,第1张

概述我已经编程了一段时间,关于COM / ActiveX对象,我面临着非常奇怪的问题,这些问题显然超出了我的知识. 这里是. 我的软件使用后期绑定与COM对象进行通信. 由于这些COM对象与硬件(例如科学相机)对话,我选择将所有调用都转换为专用线程.这允许主线程与用户交互. 所以我将消息从主用户线程(或任何其他线程)发送到设计为仅处理activeX的线程. 这是它的样子 procedure Myt 我已经编程了一段时间,关于COM / ActiveX对象,我面临着非常奇怪的问题,这些问题显然超出了我的知识.
这里是.
我的软件使用后期绑定与COM对象进行通信.
由于这些COM对象与硬件(例如科学相机)对话,我选择将所有调用都转换为专用线程.这允许主线程与用户交互.
所以我将消息从主用户线程(或任何其他线程)发送到设计为仅处理activeX的线程.

这是它的样子

procedure MythreadActiveX.execute;begin  CoInitialize(nil);  Try  ComObject       :=CreateolEObject(COMID);  While not Terminated do  Begin  If PeekMessage(Msg,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 / Server失败,尤其是在Visual Basic中编写,我注意到了进程浏览器,尽管我在上面做了什么,但是ActiveX代码被执行到主线程中!
结果导致了
– 主线程持有
– 主线程内存损坏(例如,使用大型数组)… ==我的应用程序崩溃

原因是什么?这与ActiveX线程模型有关吗?
我想理解并纠正我的代码以应对(在这种情况下,COM将在主线程中运行….)

谢谢
(因为我花时间在这上面,我准备提供更多信息以便理解)

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

另见this question.

总结

以上是内存溢出为你收集整理的Delphi COM对象多线程全部内容,希望文章能够帮你解决Delphi COM对象多线程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1271504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存