LPCTSTR 和const char lpcwstr*类型的转换

2797人阅读
'CFile:: Open' : 无法将参数 1从 'const char [11]' 转换成'LPCTSTR'
在写一个读档和写档的练习,其实是从msdn范例作小修改而已,环境是VS2005,类型是主控应用程序,设定支援MFC库,Compile时总是出现:error C2664:'CFile:: Open' : 无法将参数 1从 'const char [11]' 转换成'LPCTSTR'
程序如下:
Code Snippet
CFile sourceFCFile destF
CFileE// open the source file for readingif (!sourceFile.Open("TP",CFile::modeRead | CFile::shareDenyWrite, &/ex))
&&&&&&&&&&&&&& :
但若改成下面的方式,就能通过 Code Snippet
CFile sourceF&& CFile destF
LPCTSTR strFileName=L"TP";&& if (!sourceFile.Open(strFileName,CFile::modeRead | CFile::shareDenyWrite, &ex))
&&&&&&&&&&&&&& :
这是因为:VS2005使用Unicode字元集, 字串必须转换成Unicode字串才可以使用, 而
中的L, 就是将字串转换成Unicode的元集
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7287次
排名:千里之外
转载:11篇
(4)(2)(1)(3)(2)[原]【编程拾遗】VC++中LPCTSTR、CString、char *、string之间的相互转换 - 推酷
[原]【编程拾遗】VC++中LPCTSTR、CString、char *、string之间的相互转换
在VC2012中,字符集默认采用Unicode字符集(Use Unicode Charecter Set选项),其值还可以设置为多字节字符集(Use Multi-Byte Charecter Set)。
为什么要使用Unicode
可以很容易地在不同语言之间进行数据交换。
使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
Windows定义的Unicode数据类型有哪些
WCHAR Unicode字符;
PWSTR 指向Unicode字符串的指针;
PCWSTR 指向一个恒定的Unicode字符串的指针;
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR;
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
如何对Unicode进行操作
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
如何表示Unicode字符串常量
ANSI &string&
Unicode L&string&
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
_T 会根据你工程的设置自动转换UNICODE和非UNICODE,L 就是转为UNICODE。Visual C++里边定义字符串的时候,用_T来保证兼容性,是一种数据类型,但是它不会产生结果,被编译系统的预处理系统来解释,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。
_T是将字符串转换为TCHAR,TCHAR是一个宏定义,当定义了UNICODE时TCHAR等同于WCHAR,否则等同于CHAR。为了和以后的平台兼容,建议使用TCHAR,而不要使用普通的CHAR。例子:TCHAR&
s = _T(&FSDF&)。L将字符串转换为WCHAR,用于需要UNICODE的环境。例子:WCHAR&
s = L&FSDF& 。
LPCTSTR和CString的关系
LPCTSTR类型:
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串
这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
在程序中我们大部分时间要使用带T的类型定义。
LPCTSTR相当于const TCHAR *,在之前看到TCHAR为ANSI/Unicode通用数据类型,当定义了UNICODE时TCHAR等同于WCHAR,否则等同于CHAR。
常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T(&abcd&)时, 字符串&abcd&就会根据编译时的是否定一_UNICODE来决定是char
&还是 w_char
。 同样,TCHAR 也是相同目的字符宏。
ANSI情况下,LPCTSTR 就是 const char&
, 是常量字符串(不能修改的);而LPTSTR就是char&
, 即普通字符串(非常量,可修改的)。
CString和LPCTSTR
CString和LPCTSTR可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
CString和LPCTSTR这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。
当你需要一个const char
而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。
当需要CString , 而传入了const char&
时(其实 char * 也可以),C++编译器则自动调用CString的构造函数来构造临时的CString对象。
CString 转LPCTSTR:
CString cS
const char *lpctStr=(LPCTSTR)cS
LPCTSTR转CString:
LPCTSTR lpctS
CString cStr=lpctS
如何在Unicode与ANSI之间转换字符串
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
CString --&char *
CString str1 =_T(&123&);
int len = WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);
char *ptxtTemp = new char[len +1];
WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );
delete[] ptxtT
char * --&CString
char *p =&test&;
CString str(p);
char * pFileName = &你好,世界!Hello,World&;
//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(pFileName);
//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);
//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);
buf[len] = ‘\0‘; //添加字符串结尾,注意不是len+1
//将TCHAR数组转换为CString
CString pWideC
pWideChar.Append(buf);
//删除缓冲区
转载请注明作者Jason Ding及其出处
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见不能将参数 1 从“const char [6]”转换为“LPCTSTR”的问题
[问题点数:50分,结帖人creative_li]
不能将参数 1 从“const char [6]”转换为“LPCTSTR”的问题
[问题点数:50分,结帖人creative_li]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2006年10月 总版技术专家分月排行榜第二2006年9月 总版技术专家分月排行榜第二
2006年1月 荣获微软MVP称号2008年1月 荣获微软MVP称号2007年1月 荣获微软MVP称号
本帖子已过去太久远了,不再提供回复功能。C++ 编译时提示:不能将参数 1 从“char [6]”转换为“LPCTSTR”_百度知道
C++ 编译时提示:不能将参数 1 从“char [6]”转换为“LPCTSTR”
CString MET char Count[6]; int a,b; m_MultiEdit.GetWindowTextW(METext); a=METext.GetLength(); b=m_MultiEdit.GetLi俯骸碘缴鄢剂碉烯冬楼neCount(); a-=(b-1); itoa(a,Count,10); m_CharEdit.SetWindowTextW(Count); itoa(b,Count,10); m_LineEdit.SetWindowTextW(Count);
提问者采纳
setWindowTextW() 后面这个W代表的是宽字节类型 即WCHAR类型 也就是说setWindowTextW()中的参数是一个WCHAR类型的指针 那就不能将 CHAR 类型转换为俯骸碘缴鄢剂碉烯冬楼WCHAR类型了 编译器就报错了setWindowTextA()这个中的指针是一个CHAR类型的指针可将那个W删除程序就OK了修改如下CString MET char Count[6]; int a,b; m_MultiEdit.GetWindowText(METext); a=METext.GetLength(); b=m_MultiEdit.GetLineCount(); a-=(b-1); itoa(a,Count,10); m_CharEdit.SetWindowText(Count); itoa(b,Count,10); m_LineEdit.SetWindowText(Count);一般在工程中都是使用SetWindowText 而不是直接写SetWindowTextA 或者SetWindowTextW编译器会自动根据UNICODE _UNICOUDE 自动转换成相应的CHAR 或者 WCHARCHAR
WCHAR 一般都写为TCHAR如果你的工程就是设置为多字节的工程,那也可以直接使用CHAR VC++6.0的工程默认是多字节的工程 SetWindowTextA,SetWindowTextW,前者是多字节,后者是unicode版本
说的很详细,我用的是VS2010 你说的方法还是编译不过去
提问者评价
其他类似问题
lpctstr的相关知识
按默认排序
其他1条回答
LPCTSTR == const TCHAR * 而char是LPTSTR 这是不一样的。建议你看看俯骸碘缴鄢剂碉烯冬楼这个网页:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁CString_char_const_char__LPCTSTR_的转换57
上亿文档资料,等你来发现
CString_char_const_char__LPCTSTR_的转换57
用C++的经常遇到这些问题;CString,char*,constchar*;如何将CString类型的变量赋给char*类型;1、GetBuffer函数:;使用CString::GetBuffer函数;char*p;;CStringstr=&hello&q;p=str.GetBuffer(str.GetL;str.ReleaseBuffer();
用C++的经常遇到这些问题。CString,char*,const char *,LPCTSTR 的转换如何将CString类型的变量赋给char*类型的变量1、GetBuffer函数:使用CString::GetBuffer函数。char *p;CString str=&hello&;p=str.GetBuffer(str.GetLength());str.ReleaseBuffer();将CString转换成char * 时CString str(&aaaaaaa&);strcpy(str.GetBuffer(10),&aa&);str.ReleaseBuffer();当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *2、memcpy:CString mCS=_T(&cxl&);char mch[20];memcpy(mch,mCS,20);3、用LPCTSTR强制转换: 尽量不使用char *CSch=(LPSTR)(LPCTSTR)CString str = &good&;char *sprintf(tmp,&%s&,(LPTSTR)(LPCTSTR)str);4、CString MMsg=Msg+&abc&;LPTSTRlpsz = new TCHAR[Msg.GetLength()+1];_tcscpy(lpsz, Msg);char *strcpy(psz,lpsz); CString类向const char *转换char a[100];CString str(&aaaaaa&);strncpy(a,(LPCTSTR)str,sizeof(a));或者如下:strncpy(a,str,sizeof(a));以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.CString转LPCTSTR (const char *)CString cSconst char *lpctStr=(LPCTSTR)cSLPCTSTR转CStringLPCTSTR lpctSCString cStr=lpctS将char*类型的变量赋给CString型的变量可以直接赋值,如:CString myString = &This is a test&;也可以利用构造函数,如:CString s1(&Tom&);将CString类型的变量赋给char []类型(字符串)的变量1、sprintf()函数CString str = &good&;char tmp[200] ;sprintf(tmp, &%s&,(LPCSTR)str);(LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)strCString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR去掉const,是极为危险的!一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。2、strcpy()函数CSchar c[256];strcpy(c, str);char mychar[1024];CString source=&Hello&;strcpy((char*)&mychar,(LPCTSTR)source); 包含各类专业文献、行业资料、各类资格考试、中学教育、生活休闲娱乐、专业论文、应用写作文书、CString_char_const_char__LPCTSTR_的转换57等内容。
 (lpsz, Msg); char * strcpy(psz,lpsz); CString 类向 const char *转换 转换 char a[100]; CString str(&aaaaaa&); strncpy(a,(LPCTSTR)str,...  (LPCTSTR)str,sizeof(a)); 2 CString 类型的转换成 int CString 类型的转换...(const char *nptr); long long atoq(const char *nptr); 4 CString,int,...  2.C 表示 const 3.T 是什么东西呢,我们知道 TCHAR 在采用 UNICODE 方式编译...比如 CString str(&aaaaaaa&); strcpy((char *)(LPCTSTR)str,&aa&); ...  哈哈 char * p CS p = (char*)(LPCTSTR) str = (CString...在代码中未定义 UNICODE 的情况下 LPTSTR 等价于 char * LPCSTR 等价于 const...  4.char *pch = (LPSTR)(LPCTSTR)mCS 这样没有报错,但 pch 只能获得 CString 的第一个字符而已, 第一个换成(char*),也只能获取第一个字符。 郁闷。...  char*作为参数的, 因此有一个必不可少的步骤就是把 CString 转换为 shar* ...char* size_t origsize = wcslen(origString) + 1; const size_t newsize =...   CString型、 char型、string型之间的转化_计算机软件及应用_IT/计算机_专业资料...CS char *p = (LPSTR)(LPCTSTR) ②、string 转 CString ...  char * CString cstr(asdd); const char* ch = (LPCTSTR) 举例: CString char* str= &i am good &; lp=str.GetBuffer(str.GetLength()); str....  CString 转换为 char* ☆强制类型转换为LPCTSTR CString theString((_T(&Char ...(或可移植的_tcscpy)的第二参数是const wcahr_t*(Unicode) 或const char*(...

我要回帖

更多关于 const char lpcwstr 的文章

 

随机推荐