首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi和Internet Explorer,创建“全局”IE

Delphi和Internet Explorer,创建“全局”IE
EN

Stack Overflow用户
提问于 2012-10-10 18:32:20
回答 1查看 3.5K关注 0票数 1

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

代码语言:javascript
复制
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“对象。

第二次,第三次...call of OpenIE -普通的call ie := CreateOleObject

当我尝试对它进行编码时,我得到了一些线程和编组错误,我在这方面是新手。做这件事的合适方法是什么(一些小的代码示例会更好)?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 18:45:17

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

代码语言:javascript
复制
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事件处理程序。因此它在主GUI线程中运行。

如果您从GUI线程以外的线程调用OpenIE函数,这将解释您的错误。如果您在创建浏览器的线程之外的线程上访问浏览器,您将收到一条EOleSysError,其中包含一条消息:应用程序调用的接口是为另一个线程编组的。

最后,在提问时给你一个忠告。如果收到错误消息,请确保在问题中包含准确的错误消息。这样做可以使我们更有可能提供好的答案。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12817277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档