我用vc些的MFC ActiveX 控件项目,在ie中使用,ie关闭时有时会出现错误

akang1982 2007-08-27 06:37:09
如果使用debug版本的activex,在ie关闭的时候出现Debug Assertion Failed!引起错误的代码在wincore.cpp中,如下:

/////////////////////////////////////////////////////////////////////////////
// The WndProc for all CWnd's and derived classes

LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);《《《《《《《《《《《《《《《《《《引发错误的行
ASSERT(pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}
...全文
522 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
KKND2006 2007-09-06
  • 打赏
  • 举报
回复
debug版本是这么个问题,做成release就没问题了

你实际发布的时候肯定不是把debug版本给别人么
nkgd 2007-09-04
  • 打赏
  • 举报
回复
IE6中,切换和关闭是不一样的,关闭的时候IE直接摧毁窗口,并不通知控件析构,这个时候就可能导致空间出错的。
nkgd 2007-09-04
  • 打赏
  • 举报
回复
切换的时候是会通知控件析构的,我说的是直接关闭窗口的时候,不做任何处理的话,是不会到控件的析构里面去的
oo1w 2007-09-04
  • 打赏
  • 举报
回复
IE6中,切换和关闭是不一样的,关闭的时候IE直接摧毁窗口,并不通知控件析构,这个时候就可能导致空间出错的。
不会阿。
我最近一直在搞控件这个切换的问题。
切换后,控件是会析构。
如果切换不通知控件析构的话,我切换多个包含不同控件的页面,最后关闭的时候,前面的控件不就无法释放了。
coolwind_77 2007-09-04
  • 打赏
  • 举报
回复
显然是过早地释放了一个窗口,可能有一个动态创建地窗口(CWnd地对象),但是该窗口在控件地OnDestroy之前就被系统释放了(比如它地子窗口),而其CWnd对象却要在控件关闭时释放,于是发现和其连接地句柄已经无效了。请检查是否有类似操作。
oo1w 2007-09-03
  • 打赏
  • 举报
回复
切换等同于关闭了。
nkgd 2007-08-30
  • 打赏
  • 举报
回复
IE关闭的时候出错,那么如果不关闭,切换到其他页面呢?比如切换到一个空页面时候是否会出错?
huzs_82 2007-08-30
  • 打赏
  • 举报
回复
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL); //查源码,这句断言出错,说明pWnd为NULL了.
在MSDN上查找函数:CWnd::FromHandlePermanent()
"Returns a pointer to a CWnd object when given a handle to a window. If a CWnd object is not attached to the handle, NULL is returned."
再自己进一步检查确认吧.

datapub 2007-08-29
  • 打赏
  • 举报
回复
GZ, 这个问题应该比较普遍
akang1982 2007-08-28
  • 打赏
  • 举报
回复
出错在 debug assert faild
ieplore.exe
wincore.cpp
line:384
cause a assertion
akang1982 2007-08-28
  • 打赏
  • 举报
回复
我把在控件里面创建的东西都注释掉了,结果还是一样的问题,
huzs_82 2007-08-28
  • 打赏
  • 举报
回复
关闭是应该会调用控件的OnDestroy()这个函数,根据你自己的情况将该关掉的资源关掉并释放内存.如果有启动另的线程的话,别忘了在这里一并结束掉.
huzs_82 2007-08-28
  • 打赏
  • 举报
回复
"Debug Assertion Failed"
肯定是那个句柄检查有问题.
你调试一下,再具体分析问题点.
按情况设置断点,按F5,然后按F10一步步调试.
akang1982 2007-08-27
  • 打赏
  • 举报
回复
我自己并不没有创建线程啊 而且在输出信息中 出错以后没有发现调用AfxDllCanUnloadNow
出错断点在AfxWndPro里面
dyw 2007-08-27
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/177101
Avoid 2007-08-27
  • 打赏
  • 举报
回复
线程没结束。。。
DentistryDoctor 2007-08-27
  • 打赏
  • 举报
回复
是否与TLS相关?
akang1982 2007-08-27
  • 打赏
  • 举报
回复
如果ie启动后立即关闭,不出问题,如果稍微等一段时间啥都不做,则它可能就会死掉
youngwolf 2007-08-27
  • 打赏
  • 举报
回复
大概是你在调用某些窗口函数的时候,调用得太早,窗口还没有创建。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧