2010-12-07 99 views
0

我正在使用一個庫,並將其中一個函數std::wstring發送給我,另一個庫需要將_TCHAR []發送給它。我如何轉換它?如何從std :: wstring _TCHAR []轉換?

+0

其他庫是否會接受** const ** _TCHAR []?也就是說,它是否打算改變數據?如果是這樣,可能會延長**數據嗎? – 2010-12-07 00:14:50

+0

是的,一個const _TCHAR []沒關係。它不打算改變數據。 – coolface 2010-12-07 00:25:04

回答

2

假設你使用Unicode構建,std :: wstring.c_str()就是你需要的。請注意,c_str()保證它返回的字符串是空終止的。

例如

void func(const wchar_t str[]) 
{ 
} 

std::wstring src; 
func(src.c_str()); 

如果您使用非Unicode建立,則需要通過WideCharToMultiByte將Unicode字符串轉換爲非Unicode字符串。

0

由於@Zach鋸說,如果你只是建立統一,你可以逃脫std::wstring.c_str(),但conteptually倒不如定義tstring(用於std::basic_string<TCHAR>一個typedef),所以你可以放心地使用這種字符串完美地與預期的所有Windows和庫功能TCHAR s 。

有關更多的樂趣,你也應該定義所有其他的字符串相關的C++設施TCHAR S,並創建轉換功能std::string/std::wstring < =>tstring

幸運的是,這項工作已經完成;見herehere


  1. 其實也沒什麼編譯庫函數可以真正指望一個TCHAR *,因爲TCHAR s的解析爲char S或wchar_t s的編譯時間,但你有這個想法。
0

使用ATL and MFC String Conversion Macros。無論您是在編譯_UNICODE還是ANSI模式,這都可以工作。

即使不使用MFC,也可以使用這些宏。只包括本示例中顯示的兩個ATL標頭:

#include <string> 

#include <Windows.h> 

#include <AtlBase.h> 
#include <AtlConv.h> 

int main() 
{ 
    std::wstring myString = L"Hello, World!"; 

    // Here is an ATL string conversion macro: 
    CW2T pszT(myString.c_str()); 

    // pszT is now an object which can be used anywhere a `const TCHAR*` 
    // is required. For example: 
    ::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK); 

    return 0; 
}