我几周前遇到了一个问题,似乎没有逻辑上的解释。我正在使用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;