gpt4 book ai didi

multithreading - Delphi 从 2 个不同的线程访问 OleObject

转载 作者:行者123 更新时间:2023-12-03 18:55:42 26 4
gpt4 key购买 nike

我有一些用于打开 IE 的继承代码,但遇到了一些麻烦,这就是我所拥有的:

IEUnit.pas (no form) 有 LoadIE 和 OpenIE 的例程

从单独的线程调用 OpenIE,它看起来像这样

procedure OpenIE(URL: OleVariant; FieldValues: string = '');
var ie : IWebBrowser2; // <-- This should become "global" variable for the IEUnit
begin
ie := CreateOleObject('InternetExplorer.Application') as IWebBrowser2;
ie.Navigate2(URL, Flags, TargetFrameName, PostData, Headers);
ShowWindow(ie.HWND, SW_SHOWMAXIMIZED);
ie.Visible := true;
...
end;

我想在单元中有“全局”即变量,并像这样编写 LoadIE 例程:

LoadIE 应该从 FormCreate 调用(主线程)

它应该只创建“全局”即对象
  ie := CreateOleObject('InternetExplorer.Application') as IWebBrowser2;

所以OpenIE函数不需要创建它,只是为了使用它(目的是加快速度)

所以问题是如何从 2 个不同的线程访问同一个 OLE 对象,一个创建对象,另一个使用它。

当我编写不处理线程的代码时,我得到一个错误

带有消息的异常类 EOleSysError '应用程序调用了为不同线程编码的接口(interface)'

我应该怎么做,照顾线程(我没有线程经验,欢迎一些阅读和视频链接)。

提前致谢

最佳答案

MTA model COM 服务器只能在其关联的公寓内使用。这是explanation错误与以下建议:

The correct way of transferring an interface pointer (either a direct pointer or a proxy pointer) from one apartment to another is via COM's marshaling mechanism. The source apartment can call CoMarshalInterThreadInterfaceInStream() to marshal the interface pointer to a shared (global) stream. The destination apartment can unmarshal this interface pointer by calling CoGetInterfaceAndReleaseStream().

关于multithreading - Delphi 从 2 个不同的线程访问 OleObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12840724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com