2006年11月2日 星期四

HOWTO Convert Char 2 LPCWSTR

強制轉換

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);

參考

沒有留言: