gpt4 book ai didi

Delphi和Internet Explorer,创建 "global"IE

转载 作者:行者123 更新时间:2023-12-01 22:25:16 24 4
gpt4 key购买 nike

我有一些用于打开 IE 的继承代码,这是简短版本:

procedure OpenIE(URL: OleVariant; FieldValues: string = '');
var ie : IWebBrowser2;
begin
ie := CreateOleObject('InternetExplorer.Application') as IWebBrowser2;
ie.Navigate2(URL, Flags, TargetFrameName, PostData, Headers);
ShowWindow(ie.HWND, SW_SHOWMAXIMIZED);
ie.Visible := true;
...
end;

由于 CreateOleObject 需要很长时间才能执行,我希望有一个“准备好”的 IE 供第一次运行。

例如,在 Main FormCreate 中调用 CreateOleObject,然后第一次调用 OpenIE 时使用已创建的“IE”对象。

对于 OpenIE 的第二次、第三次...调用 - 只是普通调用 即:= CreateOleObject

当我尝试编码时,我收到一些线程和编码错误,我是这个领域的新手。执行此操作的正确方法是什么(一些小代码示例就很好)?

提前致谢。

最佳答案

也许您正在不同的线程中创建浏览器实例,然后从中发出后续调用。以下简单代码完全按照预期工作:

type
TMainForm = class(TForm)
ShowBrowser: TButton;
procedure FormCreate(Sender: TObject);
procedure ShowBrowserClick(Sender: TObject);
private
FBrowser: Variant;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
FBrowser := CreateOleObject('InternetExplorer.Application');
end;

procedure TMainForm.ShowBrowserClick(Sender: TObject);
begin
FBrowser.Navigate('http://stackoverflow.com');
ShowWindow(FBrowser.HWND, SW_SHOWMAXIMIZED);
FBrowser.Visible := True;
end;

我没有使用 IWebBrowser2 因为我手头没有导入单元。但这不会改变任何事情 - 您的问题将与早期/晚期绑定(bind)无关。

显然,FormCreate 在 GUI 线程中运行。 ShowBrowserClick 是一个按钮 OnClick 事件处理程序。因此它在主 GUI 线程中运行。

如果您从 GUI 线程以外的线程调用 OpenIE 函数,则可以解释您的错误。如果您在创建浏览器的线程以外的线程上访问浏览器,您将收到一个 EOleSysError,其中包含消息应用程序调用了一个为不同线程编码的接口(interface).

最后,提一下提问时的建议。如果您收到错误消息,请确保在问题中包含确切的错误消息。这样做使我们更有可能提供好的答案。

关于Delphi和Internet Explorer,创建 "global"IE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817277/

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