Winocc.cpp,line345问题的调试(原创)

标签:
it |
分类: VC |
这个问题让我头疼了一天,不过功夫不负有心人终于让我给解决了
好了,闲话少说,先说一下我程序的状况
http://s8/middle/6084f588ga4f8372eafe7&690
在一对话框中拖入一个DATAGRID再给它关联一个变量m_datagrid
然后在对话框对应类的构造函数中加入如下代码:
前面不做过多解释,只解释最后一行,将数据集中的内容显示到m_datagrid所对应的控件中(此为t_student表)
然后运行程序,出现
http://s7/middle/6084f588g76e59f3261a6&690
继续调试,定位错误
http://s13/middle/6084f588g76e59f43175c&690
定位在
ASSERT(m_pCtrlSite!=NULL);
从网上知,此错误为空指针错,也就是m_pCtrlSite未初始化(对应OLE控件为m_datagrid),
可通过调用Create方法解决,于是我调用Create方法,上述问题是解决,不幸的是,又抛出另外一个错误窗口.
我想,既然已经关联了变量怎么还会是空呢,很有可能是错误出在调用顺序上
我想,控件变量通过调用
http://s12/middle/6084f588g76e59f8aeb3b&690
函数进行数据交换,很有可能程序的调用顺序是先进行构造函数,再进行DoDataExchange调用,是不是这样调试一下就知道了
我在构造函数和DoDataExchange函数处各加一个断点,调试
http://s4/middle/6084f588ga4f83c2e20b3&690
没错程序果然先停在了构造函数处,
也就是说我们的m_datagrid还没进行数据映射就已经在构造函数中调用了,因此会抛出上面的异常.
那么我们就只能去考虑虚函数或者是window handler了,
经测试这个可用
http://s12/middle/6084f588ga4f83ccd960b&690
把构造函数中的内容移到这个处理中问题解决,看一下结果
http://s6/middle/6084f588ga4f83d4d4d65&690
这样就OK了
总结:::::::::::::::::::::::::
原来我是不喜欢把自己的一些调试过程记录下来的,觉得有些浪费时间,当然我也不喜欢去截图去敲内容,但后来发现我没有那么好的记忆力,因为每一个问题的解决都是从网上众多文章,源码中提炼出来的,当再次遇到同类我又不得不辛苦再去查,反而浪费更多时间精力,当然更加是耐心。