ActiveX控件嵌入网页,当关闭网页时,能否自动销毁控件?当我每次关闭嵌入ActiveX控件的网页时都汇报错,错误是:
Debug Assertion Failed!
Program:C:\Program Files\Internet Explorer\iexplore.exe
File:wincore.cpp
Line:365
....
....
是什么问题,如何解决?谢谢!!
Debug Assertion Failed!
Program:C:\Program Files\Internet Explorer\iexplore.exe
File:wincore.cpp
Line:365
....
....
是什么问题,如何解决?谢谢!!
void CMyControl::OnSetClientSite()
{
if (m_pClientSite)
//父窗口及其大小并不重要,因为控件在本地激活时会自动重画和重新定位。
VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0), CRect(0,0,0,0)));
else
DestroyWindow();
COleControl::OnSetClientSite();
}ATLATL对IOleObject::SetClientSite()的实现有一个IOleClientSite类型的参数(MFC在对IOleObject::SetClientSite()的实现中保存这个指针到COleControl::m_pClientSite),直接拿来判断就行了。同时,ATL没有重新设置控件的父窗口,所以控件需要手动进行本地激活。// CMyControl 派生于CComControl
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
{
if (pClientSite)
{
RECT rc = {0,0,0,0};
// Don't have access to the container's window so just use the
// desktop. Window will be resized correctly during in-place
// activation.
HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
_ASSERT (hWnd);
}
else
::DestroyWindow(m_hWnd);
return IOleObjectImpl::SetClientSite (pClientSite);
}HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
{
// Get the container's window. _ASSERT (m_spClientSite);
LPOLEINPLACESITE pInPlaceSite = NULL;
HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void **)&pInPlaceSite);
_ASSERT (SUCCEEDED (hr) && pInPlaceSite);
HWND hParent = NULL;
hr = pInPlaceSite->GetWindow (&hParent);
_ASSERT (SUCCEEDED (hr) && hParent);
pInPlaceSite->Release ();
// Set container window as our parent window
SetParent (hParent); < BR > return CComControlBase::InPlaceActivate(iVerb, prcPosRect); < BR > }重现问题的步骤 使用MFC 或者ATL创建一个ActiveX控件
添加这两个消息的处理函数
使用IE作为调试程序
参考ActiveX Control Containers(Internet Development SDK)
KB Q195188 PRB: ActiveX Control Window Is Not Created Until Visible in Internet Explorer
Notes on Implementing an OLE Control Container(Kraig Brockschmidt)
Introduction to ActiveX Controls (Internet Development SDK)
Reusing MSHTML (Internet Development SDK)
用ATL和MFC来创建ActiveX控件(George Shepherd)
00421285 mov dword ptr [ebp-74h],esi
00421288 mov al,byte ptr [esi]
0042128A cmp al,bl
0042128C je 00421292
0042128E cmp al,22h
00421290 jne 00421284
IOleObject_Close在覆盖这2个方法的时候,注意要调 CComControlBase 的相应方法