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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BSTR、char*和CString转换

發布時間:2025/3/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BSTR、char*和CString转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文: http://blog.csdn.net/zeuskaaba/article/details/4082826


(1) char*轉換成CString

  若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:

[cpp]?view plain?copy
  • char?chArray[]?=?"This?is?a?test";??
  • char?*?p?=?"This?is?a?test";???
  •   或

    [cpp]?view plain?copy
  • LPSTR?p?=?"This?is?a?test";???
  •   或在已定義Unicode應的用程序中

    [cpp]?view plain?copy
  • TCHAR?*?p?=?_T("This?is?a?test");??
  •   或

    [cpp]?view plain?copy
  • LPTSTR?p?=?_T("This?is?a?test");??
  • CString?theString?=?chArray;??
  • theString.Format(_T("%s"),?chArray);??
  • theString?=?p;???
  • ?

    (2) CString轉換成char*

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

      方法一,使用強制轉換。例如:

    ?

    [cpp]?view plain?copy
  • CString?theString(?"This?is?a?test"?);??
  • LPTSTR?lpsz?=(LPTSTR)(LPCTSTR)theString;???
  •   方法二,使用strcpy。例如:

    ?

    [cpp]?view plain?copy
  • CString?theString(?"This?is?a?test"?);??
  • LPTSTR?lpsz?=?new?TCHAR[theString.GetLength()+1];??
  • _tcscpy(lpsz,?theString);???
  •   需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。

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

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

    (3) BSTR轉換成char*

      方法一,使用ConvertBSTRToString。例如:

    [cpp]?view plain?copy
  • #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的賦值運算符重載。例如:

    [cpp]?view plain?copy
  • _bstr_t?b?=?bstrText;??
  • char*?lpszText2?=?b;???
  • ?

    (4) char*轉換成BSTR

      方法一,使用SysAllocString等API函數。例如:

    [cpp]?view plain?copy
  • BSTR?bstrText?=?::SysAllocString(L"Test");??
  • BSTR?bstrText?=?::SysAllocStringLen(L"Test",4);??
  • BSTR?bstrText?=?::SysAllocStringByteLen("Test",4);???
  • ?

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

    [cpp]?view plain?copy
  • //COleVariant?strVar("This?is?a?test");??
  • _variant_t?strVar("This?is?a?test");??
  • BSTR?bstrText?=?strVar.bstrVal;???
  • ?

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

    [cpp]?view plain?copy
  • BSTR?bstrText?=?_bstr_t("This?is?a?test");???
  • ?

      方法四,使用CComBSTR。例如:

    [cpp]?view plain?copy
  • BSTR?bstrText?=?CComBSTR("This?is?a?test");???
  •   或

    [cpp]?view plain?copy
  • CComBSTR?bstr("This?is?a?test");??
  • BSTR?bstrText?=?bstr.m_str;???
  • ?

      方法五,使用ConvertStringToBSTR。例如:

    [cpp]?view plain?copy
  • char*?lpszText?=?"Test";??
  • BSTR?bstrText?=?_com_util::ConvertStringToBSTR(lpszText);???
  • ?

    (5) CString轉換成BSTR

      通常是通過使用CStringT::AllocSysString來實現。例如:

    [cpp]?view plain?copy
  • CString?str("This?is?a?test");??
  • BSTR?bstrText?=?str.AllocSysString();??
  • …??
  • SysFreeString(bstrText);?//?用完釋放??
  • ?

    (6) BSTR轉換成CString

      一般可按下列方法進行:

    [cpp]?view plain?copy
  • BSTR?bstrText?=?::SysAllocString(L"Test");??
  • CStringA?str;??
  • str.Empty();??
  • str?=?bstrText;???
  •   或

    [cpp]?view plain?copy
  • CStringA?str(bstrText);???
  • ?

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

      方法一,使用MultiByteToWideChar將ANSI字符轉換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉換成ANSI字符。

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

    [cpp]?view plain?copy
  • 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的轉換宏和類。ATL7.0在原有3.0基礎上完善和增加了許多字符串轉換宏以及提供相應的類,它具有如圖3所示的統一形式:

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

    [cpp]?view plain?copy
  • 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);???
  • ?

    結語

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


    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。