Delphi和Internet Explorer,创建"全局"IE

Mil*_*lan 1 delphi internet-explorer ole

我有一些继承的代码用于打开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;
Run Code Online (Sandbox Code Playgroud)

由于CreateOleObject需要很长时间才能执行,所以我希望第一次运行时有一个"准备好的"IE.

例如,在Main FormCreate中调用CreateOleObject,然后对OpenIE的第一次调用使用已经创建的"IE"对象.

对于OpenIE的第2次,第3次调用 - 通常调用ie:= CreateOleObject

当我尝试编写它时,我得到一些线程和编组错误,我是这个领域的新手.什么是正确的方法(一些小代码示例会很棒)?

提前致谢.

Dav*_*nan 7

也许您正在另一个线程中创建浏览器实例,然后您可以从该线程发出后续调用.以下简单代码完全按预期工作:

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;
Run Code Online (Sandbox Code Playgroud)

我没有使用,IWebBrowser2因为我没有方便的进口单位.但这不会改变任何事情 - 你的问题与早期/晚期绑定无关.

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

如果OpenIE从GUI线程以外的线程调用函数,则可以解释您的错误.如果您在创建它的线程之外的其他线程上访问浏览器,您将收到一条EOleSysError带有消息的应用程序称为为不同线程编组的接口.

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