Activex控件在IE中使用,内存泄漏问题已经何时销毁对象。 MFC开发Activex控件,在IE中调用。当IE关闭时,内存泄漏。已经重载 Onclose函数请问如果Activex需要给IE使用,该注意什么?以上问题怎么解决。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 记住释放new的东东!在代码中找你有几个new和delete. 我确定所有的对象都已经释放,new 和 deltete已经对应。不会执行 析构函数,因此我重载Onclose在onclose里释放对象内存溢出的地方所指行为 : IMPLEMENT_DYNCREATE(CMyCtrl, COleControl)在APP里有一个全局的指针g_Ctrl,在Oncreate的地方 g_Ctrl = this;因为g_Ctrl不是用new的方法构造的,因此在Onclose也不能用delete的方法删除是不是没有执行析构函数,所以g_Ctrl对象未释放?如何处理?还有IE上引入activex控件,对该网页Refresh时,会释放该控件,怎么实现控件在网页显示的时候创建,只有在close该网页的时候才释放? 大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件。基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件。这样包含ActiveX控件的网页载入更加迅速,占用内存更少。这也使得ActiveX控件的WM_CREATE处理代码直到控件第一次可见的时候才被调用。如果控件支持非窗口激活,那么IE会以非窗口激活方式创建控件,这样在离开或者关闭页面的时候控件的WM_DESTORY处理代码不会被调用。解决方案IE在初始化或者退出页面的时候会调用页面中的ActiveX控件的IOleObject::SetClientSite的实现,无论控件是否被本地激活。在初始化页面的时候,传递的指针是宿主的IOleClientSite 接口指针,在离开或者关闭页面的时候,传递的指针是空指针。可以根据这个指针来判断控件的状态,并且执行初始化或者清除的代码。MFCMFC对IOleObject::SetClientSite()的实现包含对虚函数COleControl::OnSetClientSite()的调用。这时候可以根据m_pClientSite是否为空指针来判断控件是被加载还是被清除。// CMyControl 派生于COleControl.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 > }Refresh控件的宿主HTML文档会被销毁,控件窗口不能继续存在,但是你可以手动添加引用计数来防止控件对象被删除。控件可以在此时保存状态。 由主窗口的消息循环触发的事件到另一个类中响应是不是会丢失所有数据? 创建简单对话框时对MOVEWINDOW的疑问 关于完全端口中的缓冲池 如何通过SYSTEM用户权限的进程创建一个在USER用户下运行并且具有SYSTEM权限的进程? 怎么实现阻塞和释放数据包 把时间函数所得到的时间转化成cstring类型 声音文字同步 求《visual c++.net宝典》电子书下载 数据库的导入,导出问题,来着有分,前十个每人十分,有正确答案的另外再每人给50啊! 如何拼写检查 求单纯形法、整数规划源程序(分不是问题) 如何判断CString中的数字??
不会执行 析构函数,因此我重载Onclose在onclose里释放对象内存溢出的地方所指行为 : IMPLEMENT_DYNCREATE(CMyCtrl, COleControl)
在APP里有一个全局的指针g_Ctrl,在Oncreate的地方 g_Ctrl = this;
因为g_Ctrl不是用new的方法构造的,因此在Onclose也不能用delete的方法删除
是不是没有执行析构函数,所以g_Ctrl对象未释放?如何处理?
还有IE上引入activex控件,对该网页Refresh时,会释放该控件,怎么实现控件在网页显示的时候创建,只有在close该网页的时候才释放?
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 > }Refresh控件的宿主HTML文档会被销毁,控件窗口不能继续存在,但是你可以手动添加引用计数来防止控件对象被删除。控件可以在此时保存状态。