我打开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
当我尝试代码时,我得到一些线程和编组的错误,我在这方面的新手。 什么是做到这一点(一些小的代码示例将是巨大的),正确的方法?
提前致谢。
也许你正在创建在不同的线程,从中再发出后续调用浏览器实例。 工程完全按预期以下琐碎的代码:
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
与消息应用程序调用这是编组为一个不同的线程的接口 。
最后,忠告提问的时候。 如果您收到错误消息,请确保您包括确切的错误信息在你的问题。 这样做使得它更容易,我们可以提供很好的答案。