I have implemented an IE control by deriving CAxwindow,and implementing DWebBrowserEvents2 interface, It's ok to navigate URLs, but when I want to destroy the parent window of the ID control, I will casually get a crash, especially after the js call window.external.OnXXX method. I have done the following things before destroy the parent window like the following:
CComPtr<IWebBrowser2> spWebBrowser2; HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2); if (FAILED(hRet)) return FALSE; //hRet = spWebBrowser2->Stop(); //crash either when uncomment this line. VARIANT url; url.vt=VT_BSTR; url.bstrVal=W2BSTR(L"about:blank"); hRet = spWebBrowser2->Navigate2(&url, NULL, NULL, NULL, NULL); hRet = spWebBrowser2->Quit(); hRet = IDispEventSimpleImpl<1, CMyIEWndCtrl, &DIID_DWebBrowserEvents2>::DispEventUnadvise(spWebBrowser2, &DIID_DWebBrowserEvents2); spWebBrowser2.Release(); DestroyWindow(); //destroy its parent window.
keep crashing at:
if(!PreTranslateMessage(&m_msg))
{
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
}
msg=0x00008002
message 0x00008002
wparam 0
lparam 0
call stack:
ieframe.dll!7465210f()
[Frames below may be incorrect and/or missing, no symbols loaded for ieframe.dll]
ieframe.dll!747fead4()
ieframe.dll!747fe070()
jscript9.dll!0fa95c92()
jscript9.dll!0fa95bee()
jscript9.dll!0fa95bd7()
mshtml.dll!6d40ed0a()
mshtml.dll!6d583d58()
mshtml.dll!6d5812b7()
mshtml.dll!6d58b1a1()
mshtml.dll!6d58b13d()
mshtml.dll!6da5c668()
mshtml.dll!6dd64dc8()
user32.dll!75e662fa()
user32.dll!75e66d3a()
user32.dll!75e66ce9()
user32.dll!75e677d3()
user32.dll!75e6789a()
my.exe!WTL::CMessageLoop::Run() Line 989 + 0xf bytes C++
I guess there are some IE internal code is running after destroy the parent window. there isn't running js code. I do want to know how to quit safely ? any input will be highly appreciated.
I am developing applications for Windows Mobile and Android. I like my job.