| 发表于:2007-04-25 17:29:196楼 得分:0 |
先谢谢jiangsheng(蒋晟.net[mvp])兄,我慢慢学习。 半瓶子水的人,做点东西真难,再加上自己苛求自己。 我本是一个delphi程序员,用delphi写了一个grid控件(vcl),总感觉delphi做的不是很好,用mfc重写,以前学习过vc。基本重写完成了(http://www.yfsoft.cn/soft/yfgrid.rar),却发现和脚本语言的互动上出现了问题,以前我不知道脚本语言不支持出接口。当然,我可以选择cell那样的做法,专门提供一些接口给脚本语言,追求完美的性格促使我用组件对象模型的方法为这个grid提供一个立体的接口。想当然的从ccmdtarget派生了几个类,做出了接口对象模型。可是这个grid控件(debug)在ie中运行时,总是断言错误, 在下面这个帖子里有详细的错误描述:http://community.csdn.net/expert/topic/5478/5478434.xml?temp=.1031。我跟踪后,发现基于mfc的activex控件如果在vb、delphi等环境开发的程序中运行时,只有一个窗口afxolecontrolx,如果在ie中运行时却多出一个窗口afxwndx,这个多出来的窗口背后是一个creflectorwnd类的实例。这些都不要紧,要紧的是如果在这个activex控件中增加一个从ccmdtarget派生的类后,再在ie中运行的时候就在wincore.cpp中的afxwndproc函数中出现assert错误,我对引发这个错误的原因进行了探索,发现,如果没有加ccmdtarget的派生类,在ie关闭的时候,发给这个activex的控件的消息是wm_endsession,如果增加了,在这个消息的后面还发送一个wm_destroy消息,正是这个消息,引发了上诉错误。我猜想,在wm_endsession消息中,已经将控件类的对象销毁了,后一个消息来的时候,函数fromhandlepermanent(hwnd)已经无法返回这个窗口对象了,出现了错误。能力有限啊,无法对mfc的源码进行分析。 | | |
|