我有一些用于打开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“对象。
第二次,第三次...call of OpenIE -普通的call ie := CreateOleObject
当我尝试对它进行编码时,我得到了一些线程和编组错误,我在这方面是新手。做这件事的合适方法是什么(一些小的代码示例会更好)?
提前谢谢。
发布于 2012-10-10 18:45:17
也许您正在不同的线程中创建浏览器实例,然后从该线程发出后续调用。以下简单的代码完全按照预期工作:
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,其中包含一条消息:应用程序调用的接口是为另一个线程编组的。
最后,在提问时给你一个忠告。如果收到错误消息,请确保在问题中包含准确的错误消息。这样做可以使我们更有可能提供好的答案。
https://stackoverflow.com/questions/12817277
复制相似问题