WebBrowser和Delphi 2007的OLE控制窗口误差错误



我几周前遇到了一个问题,似乎没有逻辑上的解释。我正在使用Alphacontrols和一个放置在表单上的WebBrowser组件的Delphi 2007构建应用程序。TWebBrowser从网络获取横幅并将其显示为UI。坏事是,一旦显示出横幅的表单,我就会得到" 无法获得OLE Control Window hander >",而浏览器则在表单外显示在左上方桌面的角落。

我一直在尝试任何事情来弄清楚这一点,但是调试器没有提供有关正在发生的事情的太多信息(这就是我得到的:第一个机会例外,$ 770C4B32。带有消息的例外EOleError无法获得。Ole Control窗口句柄'。Process Project1.exe(3700))。有趣的是,新项目的Form1上的同一TWebBrowser无需任何问题。

对此的任何想法都将不胜感激。

它是由关闭的HTML形式引起的。供应商的论坛显示一些可以解决问题的代码。http://www.bsalsa.com/forum/showthread.php?t=255

在OnWindowClosing事件中设置取消到True,并导航到一个 空页面如果是主要的WebBrowser。如果您的Webbrowser是 弹出窗口,您可能需要关闭EWB的表格。

procedure TForm2.EmbeddedWB1WindowClosing(ASender: TObject; IsChildWindow: WordBool; var Cancel: WordBool);
begin
  Cancel := True;
  (ASender as TEmbeddedWB).GoAboutBlank;
end;

twebbrowser仍在专注于ActiveControl,而TOleControl.HookControlWndProc被称为不再在内存中的ActiveControl。结果,由于无法获得窗口句柄,因此增加了EOleError异常。您可以通过在关闭应用程序之前将ActiveControl设置为nil(更改主动控制焦点)来避免这种情况。

 ActiveControl := nil;

这是引起异常的函数(olectrls.pas):

procedure TOleControl.HookControlWndProc;
var
  WndHandle: HWnd;
begin
  if (FOleInPlaceObject <> nil) and (WindowHandle = 0) then
  begin
    WndHandle := 0;
    FOleInPlaceObject.GetWindow(WndHandle);
    
    // Exception is raised here because WndHandle could not be obtained
    if WndHandle = 0 then raise EOleError.CreateRes(@SNoWindowHandle);
    WindowHandle := WndHandle;
    DefWndProc := Pointer(GetWindowLong(WindowHandle, GWL_WNDPROC));
    CreationControl := Self;
    SetWindowLong(WindowHandle, GWL_WNDPROC, Longint(@InitWndProc));
    SendMessage(WindowHandle, WM_NULL, 0, 0);
  end;
end;

另一种方法是将销毁消息发送到twebbrowser hander时,用参数WM_DESTROY捕获WM_PARENTNOTIFY消息,因为父级表单(twebbrowser被嵌套在其中)获取WM_PARENTNOTIFY消息:

procedure ParentNotify(var Msg: TMessage); message WM_PARENTNOTIFY;

消息处理程序的实现:

procedure TMyForm.ParentNotify(Var Msg: TMessage);
begin
if (Msg.WParamLo = WM_DESTROY) and (Msg.LParam = mywebbrowser.Handle) then close;
end; 

最新更新