Variant转化到CString
BOOL VariantToCString(_variant_t var,CString & strValue)
{
if(var.vt==VT_NULL)
{
strValue="";
return TRUE;
}
HRESULT hr=VariantChangeType(&var, &var, 0, VT_BSTR);
if (FAILED(hr))
{
return FALSE;
}
else
strValue=var.bstrVal;
strValue.TrimRight();
return TRUE;
}
//单字节转化为双字节
void CDealDataDlg::AnsiToUnicode(const char* pszText,wchar_t *pwszText,long nwszLen)
{
int nLength = MultiByteToWideChar(GetACP(),
0,
pszText,
-1,
NULL,
0);
MultiByteToWideChar(GetACP(),
0,
pszText,
-1,
pwszText,
nLength);
pwszText[nLength-1] = 0;
}
//双字节转化为单字节
void CDealDataDlg::UnicodeToAnsi(const wchar_t *pwszText,char* pszText,long nszLen)
{
int nLength = WideCharToMultiByte(GetACP(),
0,
pwszText,
-1,
NULL,
0,
NULL,
NULL);
WideCharToMultiByte(GetACP(),
0,
pwszText,
-1,
pszText,
nLength,
NULL,
NULL);
pszText[nLength-1]=0;
}
Variant转化到CString
VariantToCString(_variant_t var,CString & strValue)
{
if(var.vt==VT_NULL)
{
strValue="";
return TRUE;
}
HRESULT hr=VariantChangeType(&var, &var, 0, VT_BSTR);
if (FAILED(hr))
{
return FALSE;
}
else
strValue=var.bstrVal;
strValue.TrimRight();
return TRUE;
}
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
VARTYPE vt;
union {
short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR …
short * piVal; // VT_BYREF|VT_I2.
long * plVal; // VT_BYREF|VT_I4.
float * pfltVal; // VT_BYREF|VT_R4.
double * pdblVal; // VT_BYREF|VT_R8.
DATE * pdate; // VT_BYREF|VT_DATE.
BSTR * pbstrVal; // VT_BYREF|VT_BSTR };
}; .
.
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long数据类型
va.lVal = a; // 赋值
COleVariant v2 = "This is a test";
// 结果是VT_BSTR类型,值为"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 结果是VT_I4类型,值为2002
OLECHAR* str = OLESTR("ta ta"); // 长度为5的宽字符
CComBSTR bstr定义长度为5
wcscpy(bstr将宽字符串复制到BSTR中
CComBSTR bstr构造时复制,内容为"Hey there" 3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6);
// 2.m_str, str); // 2(wcslen(str)); // 1;
bstr1 = "Bye"; //
char * p = "This is a test";
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p = _T('/0');
s.ReleaseBuffer();
// 使用完后及时释放,以便能使用其它的CString成员函数
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR用完释放
delete[] lpszText2;
return 0;
} bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); //
char* lpszText2 = b;
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
BSTR bstrText = bstr.m_str;
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
BSTR用完释放 bstrText = str.AllocSysString();
…
SysFreeString(bstrText); //
CStringA str;
str.Empty();
str = bstrText;
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);
直接转
char *lpstr="adsfasf";
BSTR sss=(BSTR)lpstr;
1)"BSTR" Change to "unsigned char"
unsigned char b[10];
CString tempCStr;
BSTR c1 = _T("a");
tempCString = c1;
sprintf(b,"%s",tempCString.GetBuffer(10));
2) "unsigned char" to "BSTR"
unsigned char b[10];
CString tempCStr;
BSTR c1;
tempCStr = b;
c1 = tempCStr.AllocSysString();
BSTR bstrstr;//这是你要转换的BSTR变量
LPCOLESTR szFromBSTR;
szFromBSTR=bstrstr;
int nLen;
nLen=WideCharToMultiByte(CP_ACP,0,szFromBSTR,-1,NULL,NULL,NULL,NULL)
LPSTR szNewStdString;//这是转换的结果变量
szNewStdString=(char)malloc(nLen);
WideCharToMultiByte(CP_ACP,0,szFromBSTR,-1,szNewStrString,nLen,NULL,NULL);
2,
如果使用_bstr_t , 问题就很轻松!
#include<comdef.h>
BSTR bsYourString;
....
_bstr_t bstrYourString = bsYourString;
CString str = (LPCTSTR)bstrYourString;
or
LPCTSTR lpszStr = (LPCTSTR)bstrYourString;
3,
#include"comutil.h"
{
char sz[]="hello";
_bstr_t b;
b = _com_util::ConvertStringToBSTR(sz);
char * p = _com_util::ConvertBSTRToString(b);
}
C++ 字符串操作经验集
1. 字符类型和字符串
lchar,wchar_t,CHAR,BYTE,UCHAR,WCHAR,TCHAR,TBYTE
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
wchar_t是char的Unicode版本。相当于unsigned short。一般两个字节。
CHAR 和WCHAR分别是char和wchar_t的别名,决不会等同。
TCHAR是两面派,在当前编译方式为Unicode时等价于WCHAR,而ANSI(默认)方式时又等价于CHAR。
BYTE和UCHAR都相当于unsigned char,在取得字符编码(00~FF)的时候非常有用。
TBYTE也是两面派,在当前编译方式为Unicode时等价于WCHAR,而ANSI(默认)方式时又等价于BYTE。
lPSTR,PWSTR,PCSTR,PCWSTR,LPSTR,LPWSTR,LPCSTR,LPCWSTR
typedef CHAR *PSTR;
typedef WCHAR *PWSTR;
typedef CONST CHAR *PCSTR;
typedef CONST WCHAR *PCWSTR;
typedef CHAR *LPSTR;
typedef WCHAR *LPWSTR;
typedef __nullterminated CONST CHAR *LPCSTR;
typedef CONST WCHAR *LPCWSTR;
lPTSTR,LPTSTR,PCTSTR,LPCTSTR
在ANSI编译方式下,PTSTR和LPTSTR等价于LPSTR,在Unicode下等价于LPWSTR。
在ANSI编译方式下,PCTSTR和LPCTSTR等价于LPCSTR,在Unicode下等价于LPCWSTR。
lCStringA,CStringW,CString,XCHAR,YCHAR,PXSTR,PYSTR,PCXSTR,PCYSTR
CstringA是由CHAR组成的字符串
CStringW是由WCHAR组成的字符串
CString是由TCHAR组成的字符串
XCHAR表示和字符串组成字符相同的字符,YCHAR表示和字符串组成字符不同的字符
PXSTR表示和字符串组成字符相同的字符串,PYSTR表示和字符串组成字符不同的字符串
PCXSTR表示和字符串组成字符相同的CONST字符串,PCYSTR表示和字符串组成字符不同的CONST字符串
2. 字符串类型转换
l用构造方法进行CStringT类之间的转换
直接调用CString,CstringA等的构造方法,把不同的字符串类作为参数,在构造中实现转换。
CString str1;
CStringA strA1(str1); //强制转换成ANSI字符串
……对strA1进行**操作……
CString str2(strA1); //变换回去
lCStringT类和字符(串)之间的转换
调用CString的GetAt方法,可以得到XCHAR,即与字符串类组成字符相同的字符。
CStringA的GetAt方法得到的是CHAR,
CString的GetAt方法得到的是TCHAR,
CStringW的GetAt方法得到的是WCHAR。
此外,也可以使用象数组索引下标一样得到XCHAR,如 str1[2]等价于str1.GetAt(2)。
调用CString的GetBuffer方法,可以得到PXSTR,即与字符串类组成字符相同的字符串。
CStringA的GetBuffer方法得到的是LPSTR,
CString的GetBuffer方法得到的是LPTSTR,
CStringW的GetBuffer方法得到的是LPWSTR。
调用CString的GetString方法,也可以得到PCXSTR,即与字符串类组成字符相同的const字符串。
CStringA的GetBuffer方法得到的是LPCSTR,
CString的GetBuffer方法得到的是LPCTSTR,
CStringW的GetBuffer方法得到的是LPCWSTR。
l字符(串)之间的转换
使用ATL的字符串转换宏,可以实现不同类型的字符串转换。
在宏名称里面,分别用A,W,T代表ANSI字符串,Unicode字符串,以及TCHAR字符串。
并分别用CA,CW,CT来代表相应的const字符串。
对ANSI字符串进行转换操作的宏有A2W,A2T,A2CW,A2CT。
对Unicode字符串进行转换操作的宏有W2A,W2T,W2CA,W2CT。
对TCHAR字符串进行转换操作的宏有T2W,T2A,T2CW,T2CA。
*需要注意的是: 在使用以上宏的时候,必须在程序中定义如下宏,
USES_CONVERSION;
3. 字符串与其他类型之间的转换
l字符串和INT的相互转换
通过atoi,_wtoi,_ttoi可以分别把ANSI,Unicode和TCHAR字符串转换成INT。
通过_itoa,_itow,_itot可以分别把INT转换成ANSI,Unicode和TCHAR字符串。
l字符串和LONG的相互转换
通过atol,_wtol,_ttol可以分别把ANSI,Unicode和TCHAR字符串转换成LONG
通过_ltoa,_ltow,_ltot可以分别把INT转换成ANSI,Unicode和TCHAR字符串。
l字符串和DOUBLE的相互转换
通过atof,_wtof,_ttof可以分别把ANSI,Unicode和TCHAR字符串转换成DOUBLE
通过_fcvt 可以把DOUBLE数值转换为ANSI字符串。
字符串及处理之二: 基本字符串类型及函数
常用的字符串类型有:char * ,wchar_t * ,WCHAR * , TCHAR *
char *
最基本的类型,其对应的一组处理函数是以str...开头的标准的ANSI C字符串函数。
wchar_t *
是这样定义的:typedef unsigned short wchar_t;
另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t
wchar_t * 是16-bit UNICODE character(宽字符)所使用的基本类型。
其对应的一组处理函数是以wcs...开头的标准的字符串函数。
常用的字符串处理函数和宏:
1、str 开头的 函数 处理SBCS字符串
2、wcs 开头的 函数 处理宽字符串,wcs是宽字符串的英文缩写
所有的unicode函数均以wcs开头。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
对于每一个标准的ANSI C字符串函数,基本都有等价的unicode函数.
3、_mbs 开头的 函数 处理DBCS字符串
微软还在它的CRT(C runtime library)中增加了操作DBCS字符串的版本。Str***()函数都有对应名字的DBCS版本_mbs***()。
如果你料到可能会遇到DBCS字符串(如果你的软件会被安装在使用DBCS编码的国家,如中国,日本等,你就可能会),你应该使用_mbs***()函数,因为他们也可以处理SBCS字符串。(一个DBCS字符串也可能含有单字节字符,这就是为什么_mbs***()函数也能处理SBCS字符串的原因)。微软还提供了几个函数方便对dbcs的处理 , 见后面的描述。
如果只是调用strlen函数,那么你无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。ANSI的C运行期库中没有配备相应的函数,使你能够对双字节字符集进行操作。但是,Microsoft Visual C++的运行期库却包含许多函数,如_mbslen ,它可以用来操作多字节(既包括单字节也包括双字节)字符串。
4、_tcs 开头的 宏 配合TCHAR使用
根据预定义分别扩展为str wcs _mbs, 见后面的描述。
5、l开头的windows自带的宽字符处理函数
6、大小写兼有的windows自带的宽字符处理函数
5和6见后面的描述
更进一步的字符串以及其指针的类型定义
由于Win32 API文档的函数列表使用函数的常用名字(例如, "SetWindowText"),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。下面列出一些常用的typedefs,你可以在msdn中看到他们。
type Meaning in MBCS builds Meaning in Unicode builds
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR TCHAR* TCHAR*
LPCTSTR const TCHAR* const TCHAR*
本文详细介绍了在Visual C++.NET中不同字符串类型之间的转换方法,包括BSTR、LPSTR、LPWSTR、CString及其变体,以及如何在不同字符集之间进行转换。

被折叠的 条评论
为什么被折叠?



