德尔福和Internet Explorer,打造“全球” IE(Delphi and Interne

2019-10-17 07:15发布

我打开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第一次运行。

例如,在主FORMCREATE调用CreateOleObject,那么对于OpenIE的第一呼叫使用“IE”对象已经创建。

对于第二,第三...... OpenIE呼叫 - 只是平常叫即:= CreateOleObject

当我尝试代码时,我得到一些线程和编组的错误,我在这方面的新手。 什么是做到这一点(一些小的代码示例将是巨大的),正确的方法?

提前致谢。

Answer 1:

也许你正在创建在不同的线程,从中再发出后续调用浏览器实例。 工程完全按预期以下琐碎的代码:

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 ,因为我没有进口单位得心应手。 但是,这不会改变任何东西 - 你的问题将不会被涉及到早/晚绑定。

显然FormCreate运行在GUI线程。 而ShowBrowserClick是一个按钮OnClick事件处理程序。 所以它运行在主界面线程。

如果你打电话给你OpenIE从非GUI线程以外的线程功能,这可以解释你的错误。 如果您访问比创建它的另一个线程浏览器,您将收到一条EOleSysError与消息应用程序调用这是编组为一个不同的线程的接口

最后,忠告提问的时候。 如果您收到错误消息,请确保您包括确切的错误信息在你的问题。 这样做使得它更容易,我们可以提供很好的答案。



文章来源: Delphi and Internet Explorer, create “global” IE