How to Cleanly Destroy WebBrowser Control

前端 未结 3 453
夕颜
夕颜 2021-02-04 21:09

I am using ATL in VisualC++10 to host browser control. My code is similar to this example: http://msdn.microsoft.com/en-us/library/9d0714y1(v=vs.80).aspx

Difference is I

相关标签:
3条回答
  • 2021-02-04 21:36

    If I use DialogBox and drop a IEControl on it as a resource and DialogBox is derived from CAxDialogImpl<> - then while I call DestroyWindow() of dialogBox then it is automatically doing the cleanup() - which is what I required. But originally I wanted to get rid of DialogBox itself and use IEControl directly on my Window, it seems not..

    0 讨论(0)
  • 2021-02-04 21:44

    My experience is that some calls might need message processing to function properly. Try to pump some messages between your calls to Navigate, Stop etc. When working with the web browser interfaces I PostMessage myself often to trigger the next step to make sure the previous step had time to complete.

    The problem might be related to your child thread. You cannot access web browser interfaces between threads without some additional work. COM needs to be initialized as single-threaded apartment (STA). And you need to follow the rules of STAs:

    • Every object should live on only one thread (within a single-threaded apartment). Initialize the COM library for each thread.
    • Marshal all pointers to objects when passing them between apartments.
    • Each single-threaded apartment must have a message loop to handle calls from other processes and apartments within the same process. Single-threaded apartments without objects (client only) also need a message loop to dispatch the broadcast messages that some applications use.
    • ...
    0 讨论(0)
  • 2021-02-04 21:54

    I had many problems with "access violation" when closing webbrowser control, these are the steps that worked for me:

    1. Unadvise any previously advised events (DWebBrowserEvents2 in my case).
    2. If you've attached click events unattach them like this: _variant_t v; v.vt = VT_DISPATCH; v.pdispVal = 0; IHTMLDocument2->put_onclick(v);
    3. IWebBrowser2->Stop()
    4. IWebBrowser2->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0) - when closing browser window through window.external.CloseWindow() I had unhandled exceptions and OLECMDID_CLOSE fixed it.
    5. IWebBrowser2->put_Visible(VARIANT_FALSE)
    6. IWebBrowser2->Release()
    7. IOleInPlaceObject->InPlaceDeactivate()
    8. IOleInPlaceObject->Release()
    9. IOleObject->DoVerb(OLEIVERB_HIDE, NULL, IOleClientSite, 0, windowHandle_, NULL)
    10. IOleObject->Close(OLECLOSE_NOSAVE)
    11. OleSetContainedObject(IOleObject, FALSE)
    12. IOleObject->SetClientSite(NULL)
    13. CoDisconnectObject(IOleObject, 0)
    14. IOleObject->Release()

    IWebBrowser2->Quit() should not be called for WebBrowser control (CLSID_WebBrowser), it is intended only for Internet Explorer object (CLSID_InternetExplorer).

    Why must it be so hard?

    0 讨论(0)
提交回复
热议问题