WEB开发网
开发学院软件开发VC 在VC++中应当注意对VC字符集的设置 阅读

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

 2008-11-12 19:26:30 来源:WEB开发网   
核心提示: 既然调用EnableSaveRestore出现了不该出现的错误,那么就从这个函数开始找,在VC++中应当注意对VC字符集的设置(4),这个函数是这样的:.h文件声明void EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly = FAL

既然调用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);
}

上面的代码没有任何错误,既然没有错误,就要用使用以下方法来找:

1.重新为CResizableDialog写一个函数,它没有参数的,调用它,发现没有错误,看来参数有问题。

2.既然没有参数的函数没有错误,就把出问题的函数参数去掉吧,竟然也没有错误!那问题就肯定是出在参数上。

3.去掉其中一个参数,测试发现是LPCTSTR pszSection的问题,而不是BOOL bRectOnly的问题。

4.既然这样,那就换一种表示吧,把LPCTSTR pszSection换成WCHAR* pszSection,运行它,竟然不出错了!翻开MFC宏定义,就会发现其实LPCTSTR和WCHAR*是一样的,MFC真是freak!

5.但是这个函数功能还是不正常,断点进入那个函数里面发现传进去的字符串只有一个字符了,这种情况就是宽字符当成短字符时,第二个字节的当成了字符串的截止字符了,也就是说,这个函数里采用的是短字符(多字符集Multi Byte)处理的。

6.我的工程采用的是宽字符集(Unicode Char)的,检查设置,原来那个老外是用VC6编的,默认是使用多字符集(Multi Byte)的,VC真是笨啊,两个Project在一个Solution里面完全不同的设置竟然没有任何提示,简直把我弄死了!

7.把引用工程也改成使用Unicode字符集,并且把函数EnableSaveRestore WCHAR* pszSection恢复原样,搞定!果然不出我所料,Release也没有问题了!我用以前的那个测试程序来使刚好以前把它设成Multi Byte,所以也没有错误,Damn!

仅仅是一个设置啊,如果VC出错提示稍微好的,至少字符集不匹配不要说成“未定义的外部符号”也好用一点啊,难怪现在用VC的人越来越少了!

注:通常说的VC不是指使用。net framework的VC,那个很简单,内存都不用管,通常是指非托管的VC。

上一页  1 2 3 4 

Tags:VC 应当 注意

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接