日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BSTR、char* 和 CString 之间的转换 (转)

發(fā)布時間:2023/12/1 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BSTR、char* 和 CString 之间的转换 (转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BSTR、char* 和 CString 之間的轉(zhuǎn)換

?

?

  (1) char*轉(zhuǎn)換成CString

  若將char*轉(zhuǎn)換成CString,除了直接賦值外,還可使用CString::Format進(jìn)行。例如:

char chArray[] = "This is a test";
char * p = "This is a test";

  或

LPSTR p = "This is a test";

  或在已定義Unicode應(yīng)的用程序中

TCHAR * p = _T("This is a test");

  或

LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;

  (2) CString轉(zhuǎn)換成char*

  若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常常使用下列三種方法:

  方法一,使用強(qiáng)制轉(zhuǎn)換。例如:

CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;?

  方法二,使用strcpy。例如:

CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);

  需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進(jìn)行轉(zhuǎn)換。

  方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在這里添加使用p的代碼
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使用完后及時釋放,以便能使用其它的CString成員函數(shù)

  (3) BSTR轉(zhuǎn)換成char*

  方法一,使用ConvertBSTRToString。例如:

#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}?

  方法二,使用_bstr_t的賦值運算符重載。例如:

_bstr_t b = bstrText;
char* lpszText2 = b;

  (4) char*轉(zhuǎn)換成BSTR

  方法一,使用SysAllocString等API函數(shù)。例如:

BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);

  方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;

  方法三,使用_bstr_t,這是一種最簡單的方法。例如:

BSTR bstrText = _bstr_t("This is a test");

  方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test");

  或

CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;

  方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

  (5) CString轉(zhuǎn)換成BSTR

  通常是通過使用CStringT::AllocSysString來實現(xiàn)。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完釋放?

  (6) BSTR轉(zhuǎn)換成CString

  一般可按下列方法進(jìn)行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;?

  或

CStringA str(bstrText);

  (7) ANSI、Unicode和寬字符之間的轉(zhuǎn)換

  方法一,使用MultiByteToWideChar將ANSI字符轉(zhuǎn)換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉(zhuǎn)換成ANSI字符。

  方法二,使用“_T”將ANSI轉(zhuǎn)換成“一般”類型字符串,使用“L”將ANSI轉(zhuǎn)換成Unicode,而在托管C++環(huán)境中還可使用S將ANSI字符串轉(zhuǎn)換成String*對象。例如:

TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;

  方法三,使用ATL 7.0的轉(zhuǎn)換宏和類。ATL7.0在原有3.0基礎(chǔ)上完善和增加了許多字符串轉(zhuǎn)換宏以及提供相應(yīng)的類,它具有如圖3所示的統(tǒng)一形式:

  其中,第一個C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉(zhuǎn)換成一般類型的字符串常量。下面是一些示例代碼:

LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);?

  六、結(jié)語

  幾乎所有的程序都要用到字符串,而Visual C++.NET由于功能強(qiáng)大、應(yīng)用廣泛,因而字符串之間的轉(zhuǎn)換更為頻繁。本文幾乎涉及到目前的所有轉(zhuǎn)換方法。當(dāng)然對于.NET框架來說,還可使用Convert和Text類進(jìn)行不同數(shù)據(jù)類型以及字符編碼之間的相互轉(zhuǎn)換。

http://www.cnblogs.com/justin/archive/2005/03/24/125057.html

?

天極播客全新上線 新鮮視頻等你觀看
作者:一介書生,仗劍漂流 閱讀(3277) 評論(1)? 編輯 發(fā)表于:2005-12-21 12:04
相關(guān)內(nèi)容NET(C#)連接各類數(shù)據(jù)庫-集錦
C#中一些字符串操作的常用用法 [轉(zhuǎn)]
61條面向?qū)ο笤O(shè)計的經(jīng)驗原則
計算整數(shù)中1的個數(shù)的C語言實現(xiàn)
程序員的燈下黑:重知識輕技術(shù)
ARM ADS集成開發(fā)環(huán)境的使用 [二]
ARM ADS集成開發(fā)環(huán)境的使用
編程修養(yǎng)
手工打造PE文件
Path API
文章評論

# VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解 [轉(zhuǎn)] VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解 [轉(zhuǎn)]

//
CString -> char*
//
#include "atlbase.h"
CString strTmp;
char* cpTmp;
USES_CONVERSION
cpTmp=T2A(strTmp);
//
這是同事發(fā)現(xiàn)的最簡單的辦法!!!!
//


剛接觸VC編程的朋友往往對許多數(shù)據(jù)類型的轉(zhuǎn)換感到迷惑不解,本文將介紹一些常用數(shù)據(jù)類型的使用。

我們先定義一些常見類型變量借以說明

int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="女俠程佩君";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;

一、其它數(shù)據(jù)類型轉(zhuǎn)換為字符串


短整型(int)
itoa(i,temp,10);///將i轉(zhuǎn)換為字符串放入temp中,最后一個數(shù)字表示十進(jìn)制
itoa(i,temp,2); ///按二進(jìn)制方式轉(zhuǎn)換
長整型(long)
ltoa(l,temp,10);


二、從其它包含字符串的變量中獲取指向該字符串的指針
CString變量
str = "2008北京奧運";
buf = (LPSTR)(LPCTSTR)str;
BSTR類型的_variant_t變量
v1 = (_bstr_t)"程序員";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型
strcpy(temp,"123");

短整型(int)
i = atoi(temp);
長整型(long)
l = atol(temp);
浮點(double)
d = atof(temp);

四、其它數(shù)據(jù)類型轉(zhuǎn)換到CString
使用CString的成員函數(shù)Format來轉(zhuǎn)換,例如:


整數(shù)(int)
str.Format("%d",i);
浮點數(shù)(float)
str.Format("%f",i);
字符串指針(char *)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值
str = username;

五、BSTR、_bstr_t與CComBSTR


CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。
char *轉(zhuǎn)換到BSTR可以這樣: BSTR b=_com_util::ConvertStringToBSTR("數(shù)據(jù)");///使用前需要加上頭文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);


六、VARIANT 、_variant_t 與 COleVariant


VARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。
對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型數(shù)據(jù)
va.lVal=a; ///賦值

對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進(jìn)行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系:

unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF


_variant_t是VARIANT的封裝類,其賦值可以使用強(qiáng)制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;


COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;

?
?
?
文章出處:??
文章作者:?
收錄時間:2008-2-13 23:31:05 申明:所有文章都是從網(wǎng)絡(luò)上收集,若有侵權(quán),
請聯(lián)系:,我們會及時刪除

轉(zhuǎn)載于:https://www.cnblogs.com/alex_itxz/archive/2009/06/29/1513371.html

總結(jié)

以上是生活随笔為你收集整理的BSTR、char* 和 CString 之间的转换 (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。