`

LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化

 
阅读更多

首先在编译程序时经常会遇到这种问题:

错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”


1、觉得很烦,一般的做法就是不管三七二十一,在字符串前面加一个‘L’:
如调用函数FUN(LPCTSTR str)时,不能 FUN("HELLO"); 而是FUN(L"HELLO");
通常这样做都比较能解决问题。


2、或者还可以用_T(), 即 FUN(_T("HELLO")); _T() 的别名还有 _TEXT(), TEXT()。


稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等这些让人头晕的东东。(还是C#里简单啊,直接tostring)

BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。
LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针
LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针
LPCSTR:即const char *
LPCWSTR:即const wchar_t *
LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI
LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI。

 

如下是从MFC库中拷来的:

#ifdef UNICODE
    typedef LPWSTR LPTSTR;
    typedef LPCWSTR LPCTSTR;
#else
    typedef LPSTR LPTSTR;
    typedef LPCSTR LPCTSTR;
#endif 



3、相互转换方法:
前面需要定义:

USES_CONVERSION;

转换方法:

LPWSTR->LPTSTR:   W2T();
LPTSTR->LPWSTR:   T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();
ANSI->UNICODE:     A2W();
UNICODE->ANSI:     W2A();


另外,CString转为CStringW方法(通过一个wchar_t数组来转)

 CString str;
 CStringW strw;
 wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
 MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
 strw = text;


4、另外,还可以强行转换,不过不一定能成功


5、还有_bstr_t ( 对BTSTR的封装,需要#include<comdef.h> ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。

 

原文链接:http://blog.csdn.net/jize00/article/details/4379478

分享到:
评论

相关推荐

    LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

    LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别; ANSI和UNICODE的使用; Unicode宽字符转化; VC中的字符串类型和处理函数;

    LPTSTR.LPCSTR.LPCTSTR.LPSTR的来源及意义

    LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义

    LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义

    LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义

    (资料大全加程序)C++ 字符串之间的相互转化 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR)

    资料大全加程序 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR) C++ 字符串之间的相互转化

    BSTR、LPSTR和LPWSTR

    BSTR,LPSTR,LPWSTR,char*和CString相互转换。

    LPSTR、LPTSTR等类型来源及意义详述

    介绍Unicode,ANSI来源,说明LPTSTR、LPSTR等的来源和意义,阅读后会对几种类型认识更详细。适用初学者。

    VC++对字符串处理

    VC++ MFC里定义了一些宏,例如LPCTSTR表示const TCHAR*,LPTSTR表示TCHAR*,LPSTR表示char*,LPWSTR表示wchar_t*,LPCSTR表示const char*,LPCWSTR表示const wchar_t*。总之就是LP表示指针,C表示const,STR表示char...

    基础COM知识

    介绍在ADO中涉及到的数据类型转换。BSTR、VARIANT、COleVariant、_variant_t、CComBSTR、_bstr_t ...LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。Ex1: LPSTR lpstrMsg = "I'm tired.";

    Visual C++.NET中的字符串转换方法.doc

     在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集...

    优优云验证码识别答题平台DelphiDemo

    ... ... dephi完整演示程序,包括代码,演示程序包,DLL版 delphi7由于对LPWSTR支持不好,所以用delphi7编译出来的程序不能登录的,demo... DLL内部会将LPSTR转换成LPWSTR,如果采用DELPHI7编译OK的程序,性能会低于2010的

    lpstr.rar_LPS_LPSTR

    这是本人从网上和自己学习中总结的一些关于指针的使用方法和注意事项,希望有用

    在VC中读写ini配置文件的函数.pdf

    配置文件中经常用到ini文件...lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);  读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

    019-兼容型字符串(TCHAR)及相关函数.flv

    //郁金香灬老师 ...LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义 LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义 ---------------------

    VC++类型转换整理(PDF格式)

    char* zStr = (char*)(LPCTSTR)cStr; 2、char* to CString char*类型可以直接给CString,完成自动转换,例如: char* zStr = "Hello,world!"; CString cStr = zStr; 3、CString to LPCSTR 将CString转换成LPCSTR,...

    处理位图的DIB的类

    LPSTR GetBits(LPSTR lpstr); // 取得位图的宽度 DWORD GetWidth(LPSTR lpstr); DWORD GetHeight(LPSTR lpstr); // 获取调色板的大小 WORD GetPalSize(LPSTR lpstr); WORD GetColorNum(LPSTR lpstr); // ...

    Delphi与Windows API数据类型对照表

    Delphi与Windows API数据类型对照表Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 等等。

    加载动态库

    没有头文件和静态库加载C++类的输出动态库,一言不合上代码 ... LPSTR lpCmdLine, int nCmdShow) { CTest test("../SampleDll/debug/SampleDll.dll", "acadasdasdasda"); LPCSTR sVal=test.GetText(); return 0; }

    Wininet API 写的下载器类,可获取文件名,下载,等等。

    BOOL HttpGetFileName(LPCTSTR szURL,LPSTR pFileName,DWORD dwBufferOfLenght,BOOL * pResult); //将文件下载到缓冲区,而不是保存到文件 //szURL URL地址 //szBuffer 缓冲区。 //dwSize 缓冲区大小 //...

    stdafx.h代码

    stdafx.h的代码// This is a part of the Microsoft Foundation Classes C++ library. ...// All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes ...

    数字图像分割

    * 函数名称: * ThresholdDIB() * * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) * * 返回值: * BOOL - 运算成功返回TRUE,否则返回...

Global site tag (gtag.js) - Google Analytics