1. CString和char *转换 CString重载了类型LPCTSTR所以在用到const char *的地方可以直接使用CString如下: CString str=”中国人民” Char *pChar=new Char[100]; Strcpy(pChar,str)//在这里str自动调用operator LPCTSTR()返回m_pData指针,完成操作。 Strcpy(pChar,str.Getbuffer(0))//这种方法也可以 2. char *和CString的转换 char pChar[]=”中国人” CString str; Str.Format(“%s”, pChar) 3.char *和unsigned short之间的转换 char pChar[]=”a中国人” DWORD dwNum=MultiByteToWideChar(CP_ACP,0,(char *) pChar,-1,NULL,0); //可以得到ANSI字符到unicode字符所需要的空间,得到的空间比实际字符串占用的空 间加1,用来装’\0’。 WCHAR *wp=new WCHAR[dwNum]; MultiByteToWideChar(CP_ACP,0,(char *)cp,-1,wp,dwNum); Int wcCount=Wcslen(wp)//结果是4,它不包括那个’\0’。 4.unsigned short 和char *之间的转换 WCHAR pW[]=L"1中国人民a"; int b=wcslen(pW)+1;//给字符串最后的0一个字节的空间. int bb=WideCharToMultiByte(CP_ACP, 0, pW,-1, NULL, 0, NULL, NULL); //计算宽字符转换为char所需要的空间,如果第四个参数指定为-1则自动计算字符串长度,到NULL为止,并且包括NULL。否则以第四个参数指定的个数为准。 Char *pC=new char[bb]; Bb= WideCharToMultiByte(CP_ACP, 0, pW,-1, pC, bb, NULL, NULL); //应该检查bb如果bb为0则说明函数返回错误。转换完成后新串尾部包括’\0’。 5.CString 和 unsigned short 转换 CString str="a中国人1"; LPCTSTR pChar=str; DWORD dwNum=MultiByteToWideChar(CP_ACP,0,(char *) pChar,-1,NULL,0); WCHAR *wp=new WCHAR[dwNum]; MultiByteToWideChar(CP_ACP,0,(char *)pChar,-1,wp,dwNum); delete[] wp; 6.unsigned short和CString转换 转换中切不可用str.Format(“%S”,wp).这个除了转换英文和数字对中文不起作用. CString str; WCHAR pW[]=L"1中国人a"; LPTSTR p= str.GetBuffer(256); int bb=WideCharToMultiByte(CP_ACP, 0, pW,-1,p, 256, NULL, NULL); str.ReleaseBuffer(); *解释一下:GetBuffer(nMax)和ReleaseBuffer(newLen) 当你想直接使用字符串的缓冲区时,也许你不清楚缓冲区的大小是否可以进行正常使用,这时你可以使用GetBuffer(nMax),用nMax分配一个新的大小。当为0时,不进行分配,只是返回指针。 操作完成后,为了使各个其它成员函数起作用,请用RealseBuffer(nNewLen)来重新指定长度,并且在nNewLen位置上用NULL结尾。如果不用nNewLen,则默认为-1系统自动测量字符串长度,如果不是NULL结尾的,则用刚才GetBuffer分配的长度。 7._bstr_t和BSTR的关系 #if defined(WIN32) && !defined(OLE2ANSI) typedef WCHAR OLECHAR; #else typedef char OLECHAR; #endif typedef OLECHAR* BSTR; 实际上BSTR就是直接指向字符串的首地址(双字节或者ANSI字符串)。 而BSTR之前的四个字节是该字符串的长度,由编译器生成的代码自动去读这个长度,而不是用"\0"来标识字符串的结束。 BSTR 不能用new来分配内存的原因就是前四个字节是字符串长度。没办法用new来分配。 BSTR pb=SysAllocaString(L”中国人民”); 而_bstr_t就是对BSTR的封装 8._char *和BSTR的转换 char pc[]="中国人a"; BSTR pBstr=_com_util::ConvertStringToBSTR(pc); ::SysFreeString(pBstr); //必须使用否则出现内存泄露 pBstr=NULL; 注:使用时必须引用头文件#include如果出现链接错误请添加comsupp.lib或者consuppwd.lib. BSTR bstrText = _bstr_t("This is a test");//不可以用这种方法,这只是临时变量。 9._ BSTR和char *的转换 char *pC=NULL; BSTR pBstr=::SysAllocaString(L”中国人a”); pC=_com_util::ConvertBSTRToString(pBstr); SysFreeString(pBstr); PBstr=NULL; Delete[] pC; PC=NULL;//据说此种方法有内存泄露。说是用sysFreeString也不行 // /// _bstr_t bstr=pBstr; char *pP=bstr; char *pC=new char[strlen(pP)]; strcpy(pC,pP); delete[] pC.据说此法是推荐方法。 // /// 10.BSTR到_bstr_t的转换 BSTR pBstr=::SysAllocString(L"中国人a"); _bstr_t b_str(pBstr); ::SysFreeString(pBstr); 11.wchar*到_bstr_t的转换 WCHAR pC[]=L"支你"; _bstr_t b_str(pC); 12.char*到_bstr_t的转换 char pC[]="支你"; _bstr_t b_str(pC); 13._bstr_t到char*的转换 _bstr_t bstr("人民万岁12"); char *pC=bstr; int a=strlen(pC); char *pP=new char[a]; strcpy(pP,pC); delete[] pP; 13. _bstr_t到char*的转换 _bstr_t bstr("人民万岁12"); char *pC=bstr; int a=strlen(pC); char *pP=new char[a]; strcpy(pP,pC); delete[] pP; 14. _bstr_t到CString的转换 CString str; _bstr_t bstr; str=(char *)bstr; 15. CString到_bstr_t的转换 CString str="中国人a"; _bstr_t bstr; bstr=(LPCTSTR)str; 16. CString到BSTR的转换 CString str="中国人a"; BSTR bstr=str.AllocSysString(); ::SysFreeString(bstr); 17. BSTR到CString的转换 CString str; BSTR bstr=::SysAllocString(L”中国人a”); str=bstr; ::SysFreeString(bstr); 18. CComBSTR到BSTR的转换 CComBSTR combstr(10); combstr=L"中国人a"; BSTR bstr=combstr.Copy(); ::SysFreeString(bstr); bstr=NULL; 19. BSTR到CComBSTR的转换 BSTR bstr=::SysAllocString(L"中国人a"); CComBSTR combstr;//combstr(bstr);// combstr=bstr; ::SysFreeString(bstr); bstr=NULL;