char chBytes[8]; memcpy(chBytes,”aaaaaaa/0”,8); WCHAR wch[9]; n = MultiByteToWideChar( //转换Unicode到Ansi CP_ACP, 0, chBytes, 8, wch, //转换到缓冲区中 8 //最多个字节 ); wch[n] = '/0'; |
这样每次从界面取数据和把数据显示到界面上都要先做处理,但是也可以把编译环境设置成“多字符集”(Multi-Byte Character Set),就可以避免这样转换来转换去(可惜我发现的时候代码已经差不多写完了)。就是在“Project->Configuration Properties->General->Character Set,选择”Use Unicode Character Set“就是使用Uncode字符集,选择” Use Multi-Byte Character Set“就是多字节字符集。
第二次中招,god,花了我好长时间才找到问题:
我在CodeProject上找了一个很厚道的老外写的一个继承了CDialog窗体类CResizableDialog的源码,这个类的作用是使MFC 的窗体放大缩小时,窗体上的控件可以定位(Auchor),不要小看这个小小的每天都要用到的功能,用MFC实现真的很麻烦。很佩服那个老外写了那么多代码(当然跟他们的条件有关,资本主义国家的工人随便找个工作就可以衣食无忧,病了政府照顾,我们做“挨踢”的活得像民工一样,当然没有那个闲情去写那么好的代码免费给别人使用,这是题外话)。
我拿了那个现成的工程,直接在我的工程里引用他的工程。Everything works perfect.直到我把项目发布成Release的,双击运行后没有任何反应,Very weird!后来我用MessageBox打印消息,发现运行到DoModal函数里面就没有出来,程序直接退出了!使用try,catch都得不到错误!因为我的窗体是继承老外写的窗体类来的,原先继承CDialog是好好的,问题肯定在他的工程里面,可是他给的示例程序没有任何问题啊。MFC出错的时候是很要命的,它不会给你任何提示,它就是不干了!
我又拿一个前的测试程序,让它从CResizableDialog继承,也没有任何问题。
简直头大了、无语了,不知道哪里出现了问题,Release又不能像Debug那样调试,打了一堆MessageBox后还是不知道问题出现在哪里。凭着经验,可以知道程序中可能出现了内存的越界访问什么的致命错误,才会导致程序“一声不吭”地退出,但是究竟哪里出了问题呢?
就在束手无策的时候,我发现调用CResizableDialog的成员函数EnableSaveRestore会引发链接错误:“未定义的外部符号”,不引用它不会出错,测试程序引用它没有任何错误。通常这个错误造成是因为引用函数在。h文件里声明了,但是在。cpp里面没有定义,或者。cpp文件里的定义和。h上的参数对不上。但是此时不可能是这个错误,因为测试程序没有错误啊。直觉告诉我这是解决“Release后程序直接退出的关键”,说不定这个函数调用的问题解决了 Release的问题也解决了。
MFC真是很强大,它强大得不但“像迷宫一样,里面有怪兽,进去一不小心就永远出不来”,而且它让你当遇到怪兽的时候总是给你一点点星光,只要你不放弃,奇迹就会出现,你就会练成绝世神功。这跟武侠小说是相通的,主人公每次到了生死关头就会出现奇迹,成为天下无敌的高手。看看我怎么找到解决方法的,Very tricky。
既然调用EnableSaveRestore出现了不该出现的错误,那么就从这个函数开始找。这个函数是这样的:
.h文件声明 void EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly = FALSE); .cpp文件定义 void CResizableDialog::EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly/* = FALSE */) { m_sSection = pszSection; m_bEnableSaveRestore = TRUE; m_bRectOnly = bRectOnly; // restore immediately LoadWindowRect(pszSection, bRectOnly); } |
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。