原来我错怪VC60和WIN8了

自己写的一个用XP+VC60开发的简单的程序,无论怎么编译选项怎么搞,在XP和WIN7都很好运行。
可是RELEASE版本在WIN8一运行就崩溃,通过log打印,发现是OnInitDialog()函数一执行完程序就崩溃,难道是程序的堆栈乱了,可是为什么XP和WIN7中运行又好好的?
如果编译时禁用优化那么在WIN8也很好地运行,可是又很难找出到底是怎么被优化错了?
经过几天排除,发现把OnInitDialog()中的这两行代码
CHyperLink *pLinkHome;
pLinkHome = new CHyperLink();
放在一个单独的函数中,再在OnInitDialog()中调用,那么在WIN8中也能很好地运行了。
当然如果直接把这两行代码注释掉,也可以达到同样的效果

现在感觉VC60的编译器优化真不靠谱,所以自己的很多程序存在潜在的危险,真心不爽

焦头烂额了三天,搞不清是VC6编译器的问题还是WIN8的问题?

经历了几天噩梦,几乎要放弃了。
有人让我贴个重建工程,后来我干脆采用地毯式日志打印,每执行一行代码就做一次打印,终于定位到了问题的所在!!

以前,我喜欢在程序中用
CWnd* pWndPt = GetDlgItem(IDC_STATIC_PT);

的方式记录一个控件的类
以方便用 pWndPt->SetWindowText(str);的方式动态地设置控件的标题

原来这种做法是很危险的!!
虽然这种做法在99%以上的情况都是没问题的,但是危险依然存在,如果这样做而没遇到问题,完全是运气作用。
这种方式我用了十几年都没出现问题
这么多软件都没有出现问题,除了其中一个小软件在WIN8下崩溃了,虽然通过不改变程序逻辑的情况下移动整理代码或者禁止编译器优化,都可以逃过隐患,但是隐患依然存在,说不定在WIN8.2 WIN8.3中又出现崩溃了

而且你想随便写一个简单的程序复现这一现象是很难的,似乎非常地依赖于编译后的代码以及运行的系统。
有时候调用有效,有时候是调用无效但不崩溃,有时候是崩溃了


MSDN中有:
CWnd* GetDlgItem( int nID ) const;

void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

Return Value

A pointer to the given control or child window. If no control with the integer ID given by the nID parameter exists, the value is NULL. 

The returned pointer may be temporary and should not be stored for later use.

GetDlgItem的返回值是临时的,不应保存起来作后续之用

猜你喜欢

转载自blog.csdn.net/bn2918/article/details/83578671