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
当我尝试编写它时,我得到一些线程和编组错误,我是这个领域的新手.什么是正确的方法(一些小代码示例会很棒)?
提前致谢.
也许您正在另一个线程中创建浏览器实例,然后您可以从该线程发出后续调用.以下简单代码完全按预期工作:
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带有消息的应用程序称为为不同线程编组的接口.
最后,在提问时提出建议.如果收到错误消息,请确保在问题中包含该确切的错误消息.这样做使我们更有可能提供好的答案.
| 归档时间: |
|
| 查看次数: |
3099 次 |
| 最近记录: |