VC++中应当注意对VC字符集的设置

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

    同样的,你接收到的字符串想要在界面正常显示,还必须把它转换成宽字节表示:

 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);

}

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答