強制轉換
char c[20]="abc"; LPCWSTR lc=(WCHAR *)c;
但是這樣會遺失資訊
利用 ATL Macro
參考此頁
下面是幾個例子:
#include LPCWSTR lc = CA2W(c); HANDLE fh = CreateFile(CA2W(file), access_mode, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); USE_CONVERSION; LPCWSTR lc = A2W(c); LPCWSTR pw = T2W("Hello,world!"); // tchar -> wchar LPCTSTR pt = W2T(L"Hello,world!"); // wchar -> tchar
其它參考
char* 轉換成 CString
若將 char* 轉換成 CString,除了直接賦值外,還可使用 CString::Format 進行。例如:
char chArray[] = "This is a test"; char * p = "This is a test";
或
LPSTR p = "This is a test";
或在已定義 Unicode 中
TCHAR * p = _T("This is a test");
或
LPTSTR p = _T("This is a test"); CString theString = chArray; theString.Format(_T("%s"), chArray); theString = p;
CString 轉換成 char*
若將 CString 類轉換成 char*(LPSTR) 類型,常常使用下列三種方法:
使用強制轉換
例如:
CString theString( "This is a test" ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
需要說明的是,strcpy(或可移值 Unicode/MBCS 的 _tcscpy)的第二個參數是 const wchar_t* (Unicode) 或 const char* (ANSI),系統編譯器將會自動對其進行轉換。
使用 CString::GetBuffer
例如:
CString s(_T("This is a test ")); LPTSTR p = s.GetBuffer(); // 在這裏添加使用p的代碼 if(p != NULL) *p = _T('\0'); s.ReleaseBuffer(); // 使用完後及時釋放,以便能使用其他的CString成員函數
BSTR 轉換成 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;
char* 轉換成 BSTR
使用 SysAllocString 等 API 函數
例如:
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);
CString 轉換成 BSTR
通常是通過使用 CStringT::AllocSysString 來實現。例如:
CString str("This is a test"); BSTR bstrText = str.AllocSysString(); // … SysFreeString(bstrText); // 用完釋放
BSTR 轉換成 CString
一般可按下列方法進行:
BSTR bstrText = ::SysAllocString(L"Test"); CStringA str; str.Empty(); str = bstrText;
ANSI、Unicode 和寬字元之間的轉換
可以使用 MultiByteToWideChar 將 ANSI 字元轉換成 Unicode 字元,或是使用 WideCharToMultiByte 將 Unicode 字元轉換成 ANSI 字元。
另外也可以使用“_T”將 ANSI 轉換成“一般”類型字串,使用“L”將 ANSI 轉換成 Unicode,而在託管 C++ 環境中還可使用 S 將 ANSI 字串轉換成 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 的轉換類別。ATL7.0 在原有 3.0 基礎上完善和增加了許多字串轉換巨集以及提供相應的類別。
其中,第一個 C 表示“class”,以便於 ATL 3.0 相區別,第二個 C 表示常數,2 表示“to”,EX 表示要開闢一定大小的緩衝。SourceType 和 DestinationType 可以是 A、 T、W 和 OLE,其含義分別是 ANSI、Unicode、“一般”類型和 OLE 字串。例如,CA2CT 就是將 ANSI 轉換成一般類型的字串常數。下面是一些例子:
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);
沒有留言:
張貼留言