VC知识点及总结

来源:互联网 发布:淘宝双11折扣怎么设置 编辑:程序博客网 时间:2024/05/17 23:05

 

1. vc++里什么函数可以将字符串unicode和ascii互相转换

WideCharToMultiByte
MultiByteToWideChar

2. "fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾" 的原因

在工程文件中进行编译时,因为需要生成预编译头文件,所以需要在每一个类的定义的前面加入include "stdafx.h",而在我们自定义的类中,如果是用编译器帮你生成的类,那编译器就会在前面加入include "stdafx.h"这一行了,所以一般不会报错,但是如果是自已写的声明文件和定义文件,通常都会忘了加入这一行,而导致了这个错的出现。

个人观点,只是一种可能的结论而已,未获得理论上的充分支持

error C2065: 'IDD_CHATROOMSERVER_DIALOG' : undeclared identifier

error C2057: expected constant expression的解决办法

虽然不知道原因所在,但是大体是因为找不到IDD_CHATROOMSERVER_DIALOG这个常量,而这个常量定义于resource.h中,所以只要出错的文件前面include这个头文件就可以了。


 

3. 从编译一个自定义的MD5类得到的与Unicode相关的一些知识

在VC程序中使用Unicode的第一个要点是要定义UNICODE与_UNICODE宏。这一步的设置以VC 6为例,是在菜单:工程--设置--C++--预处理器 中的预处理器定义中要输入_UNICODE和UNICODE宏,一般VC建的工程中,默认是使用_MBCS 宏,也就是使用的是ANSI的编码,而不是使用UNICODE编码。我们使用_UNICODE宏代替_MBCS宏来说明我们程序中使用的是UNICODE编码方式。

第二步是注意lib文件的存在,UNICODE需要mfc42ud.dll及mfc42ud.lib文件的支持,但在某些VC 6的安装程序中,mfc42ud.lib及其它相关的lib文件支撑不够,也就说安装的时候并没有拷相应的文件到VC98/MFC/LIB目录,导致编译时会出现cann't open file "mfc42ud.lib"错误。这时最合适的解决方式是找一个较好的VC安装盘,到它的VC98/MFC/LIB目录下,把里面的lib文件全拷过来。这样编译就可以通过了。

第三步是使用UNICODE编程必须注意要定义程序的入口点,在默认使用ANSI编译的情况下,我们不需要设置程序的入口点,VC 6就能编译成功,但是定义了UNICODE宏之后,我们就需要定义程序的入口点,这一步的设置位于菜单:工程--设置--连接--输出s 中的入口点输入框,我们要在这里输入入口点:wWinMainCRTStartup。如果不输入这个的话,编译器会报LINK 2001:unresolved external symbol _Winmain@16 错。奇怪的是在VS 2003中,不用这设置这个入口点,就可以编译通过了。

第四步,确认所需的Dll文件在Window/system32目录下的存在,当相应的Lib 存在,而dll不存在时,编译通得过,但是运行起来就会出错了,所以必须拷相应的Dll文件到system32目录下去。本人拷了如下几个Dll到目录中去:mfcd42ud.dll, mfcn42ud.dll, mfco42ud.dll。由此可见,在VC 6做布置UNICODE开发环境的一个很重要问题是你的VC本身的环境要是比较正确的,建议寻找一个完整版的VS 6.0装上,之后按以上的方式布置就OK了

以上就是UNICODE编程下要注意的一些细节问题

 


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


4.将CString中的数字转成INT型的办法

    CString myStr = L"0xabc";
    int my;
    StrToIntEx(myStr,STIF_SUPPORT_HEX,&my);

    这时候要注意在使用该方法时,应该在stdafx.h文件中加入
#include "shlwapi.h"
#pragma comment(lib, "shlwapi.lib")

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

5. CString 下有的时候GetLength会返回0的解释

最大的原因在于这个String在getLenght之前做过GetBuffer操作或者类似的直接读取内存的操作,但之后没有进行ReleaseBuffer的操作,就会出现GetLength返回0的情况,如果这时候使用 WideCharToMultiByte来把String中内存的东西从Unicode转成ANSI,就会出现我们昨天看到了内存被填充成0x3f的样子的情况,事实证明,微软是不太可能出错的,错的只是我们对MSDN文档理解的不够,千万记住GetBuffer完一定要ReleaseBuffer啊,绝对是至理明言啊


DWORD ret = GetPrivateProfileString"sz_file", "filename", "", m_SZFileName.GetBuffer(FILE_PATH_LEN), FILE_PATH_LEN, "server.ini");

m_SZFileName.ReleaseBuffer();

if(!ret)

{

   Message("error in geting filename from sz_file session in server.ini");

}
// m_SZFileName not empty here
i=m_SZFileName.GetLength();
//but i==0 here

/////////////////////////////////////////////////////////////////////////////////////////

看看MSDN中有关CString.GetBuffer(...)的说明;
“If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. ”

在i=m_SZFileName.GetLength()之前调用m_SZFileName.ReleaseBuffer()就可以了。

///////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

要获得程序运行的路径,我给你一个函数:我自己就用的这个函数,呵呵,接分哦。
CString CXXXXXXApp::GetCurDir()
{
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFilename[_MAX_FNAME],Filename[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];
GetModuleFileName(AfxGetInstanceHandle(), Filename, _MAX_PATH);
_tsplitpath(Filename, sDrive, sDir, sFilename, sExt);
CString homeDir(CString(sDrive) + CString(sDir));
int nLen = homeDir.GetLength();
if(homeDir.GetAt(nLen-1) != _T('//'))
homeDir += _T('//');
return homeDir;
}
函数是可行的,稳定的。



//获取当前程序的完整路径,包括程序名
CString szPath;
GetModuleFileName(NULL,szPath.GetBuffer(MAX_PATH),MAX_PATH);
szPath.ReleaseBuffer();

//我给你一个函数吧,你放在你的APP文件类里面
//不包括程序名
CString CXXXXXXApp::GetCurDir()
{
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFilename[_MAX_FNAME],Filename[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];
GetModuleFileName(AfxGetInstanceHandle(), Filename, _MAX_PATH);
_tsplitpath(Filename, sDrive, sDir, sFilename, sExt);
CString homeDir(CString(sDrive) + CString(sDir));
int nLen = homeDir.GetLength();
if(homeDir.GetAt(nLen-1) != _T('//'))
homeDir += _T('//');
return homeDir;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VC++ Edit控件 换行问题

2008-09-01 20:05

测试/r/n测试

Edit控件属性里
MultilineWant Return两项都选成True

如果想使 超过边界(一定字数)自动换行显示 (实际上还是一行)

Edit控件属性里 Multiline 选成True ,Auto HScroll选成False(不打钩)


 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

VC中不能调试的问题,也就是设置了断点,但是却告诉你断点位置不对,然后就停在文件运行的内存的开始位置,还要去查找crt0.c文件,这个问题是由于我们在没有在环境里面设置调试信息,这个问题的另一个部分是即便你可以调试了,在调试时也无法在变量区里看到变量的值的内容,通常会出现一个很奇怪的值,或者就是看不到,但是用TRACE宏,又可以输入来,这是因为要进行调试时大致是要进行两步操作的,

1,首先在Project-->settting的属性页中的C++页的General这个部分把debug info从none选成其它的值,比如program database,这样就允许进行调试了,也就不用出现调试时,IDE会屏蔽掉所有的断点,去查找Crt0.c文件的这个问题了。

2,其实要在General部分中的Optimization设成Disable(debug)这项,这样才能在调试时在变量区中实时看到变量的值。

3,很多情况下我们调试时无法在变量窗口看到Unicode编码的字符串的值,或者说有部分情况是根本不显示字符串变量。不显示字符串变量的问题是由于调试时使用上次用过的环境下生成的pcb,pdb文件里面的内容,一般而言,有关于编译环境的东西更改以后,应该clean一下工程,删除之前的pcb,pdb文件。然后重新编译才行。至于无法看到Unicode编码的字符串的值,主要是只能看到第一个字符的值,这是因为VC的调试器默认是显示ANSI码的,而编译器 tools--options--debug下有个Display unicode strings选项,选中后即可显示了。

 


 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

error C2664: 'AfxTrace' : cannot convert parameter 1 from 'char [47]' to 'const unsigned short *' 问题 的原因

你编译的环境是Unicode的,所以要在字符串前面加上 _T

TRACE(_T("CCoolControlsManager: No hook for this thread installed!/n"));

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

C读写文本文件的问题

Q : 我往一个文本文件里写入字母可以成功,但是改成宽字后,却不能写入汉字了,这是为什么?代码如下:
#include <stdio.h>
FILE *fp=NULL;
int main()
{

wchar_t *lpString=L"怎么不对";
fp=fopen("C://hzk16.txt","at+");
wchar_t Ccheckedstr[256];
swprintf(Ccheckedstr,L"%s",L"我日哦");
fputws(Ccheckedstr,fp);
fclose(fp);

}


A : //使用setlocale函数后才能写入中文的,否则只能写入英文

#include <stdio.h>
#include "locale.h"

FILE *fp=NULL;
int main()
{
setlocale(LC_ALL, "Chinese_China");
wchar_t *lpString=L"怎么不对";
fp=_wfopen(L"C://hzk16.txt",L"at+");
wchar_t Ccheckedstr[256];
swprintf(Ccheckedstr,L"%s",L"我日哦");
fputws(Ccheckedstr,fp);
fclose(fp);

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

在Unicode下将字符串转换成INT型,atoi 应该换成 _ttoi

 

////////////////////////////////////////////////////////////////////////////////////////

 

我们今天遇到一个读取INI文件失败的问题,搞了很久最后才发现读取INI的那个函数中的路径参数要求的是绝对路径,结果我们用相对路径试了N久,最后才在别人的文章中找到答案