2011-03-11 98 views
3

我試圖做到這一點,但我沒有找到任何方法。我問這是因爲我對windows很陌生。我試過stl-strings,但visual studio 2008-在stl-wstring-handling中累積了一些bug。稍後我會在其他問題上談論這件事。現在任何人都可以解釋這個問題嗎?vC++ - 如何將CString轉換爲LPCWSTR

回答

2

這應該這樣做,假設你的應用程序尚未設置爲Unicode(如果是,就直接投):

CString str("Hello, world!"); 
CStringW strw(str); 
LPCWSTR ptr = strw; 
+0

這麼多令人費解的(而且是錯誤的)答案,以及在MFC中通過轉換c'tors完成此操作的唯一正確方法是沒有得到任何upvotes? – IInspectable 2016-06-03 13:17:30

1

如果你有那麼定義UNICODE,_UNICODE編譯器標誌一個簡單的任務應該工作。如果您有_MBCS定義您需要使用MultiByteToWideChar方法。

+0

在MFC中過於複雜。按照建議更好地使用CStringW,或者使用合適的Cx2y類。 – 2011-03-11 11:47:33

+0

'CString'有轉換c'tors。如果您需要ANSI編碼字符串中的寬字符串,只需執行'CStringW wideString(narrowString);',其中'narrowString'類型爲'CStringA'。 – IInspectable 2016-06-03 13:14:31

0

您也可以使用T2W()宏來避免寫幾行MultiByteToWideChar代碼。

+0

更好地使用Cx2y類而不是舊的T宏。 – 2011-03-11 11:46:17

6

使用像這樣的轉換類CT2CW FuncTakingLPCWSTR(CT2CW(cstring_var))。這可以保證在Unicode或MBCS版本中工作。

另外,請記住,傳遞給該函數的字符串可能是臨時的,因此請勿將其存儲以供以後使用。

+1

參考:http://msdn.microsoft.com/en-us/library/87zae4a3%28VS.80%29.aspx – Inverse 2011-03-11 17:43:26

4

最簡單的方法是使用MFC字符串轉換宏,在限定的:

http://msdn.microsoft.com/en-us/library/87zae4a3%28VS.80%29.aspx

例如,宏轉換CStringLPCWSTRCT2W(s)

另一種方法是使用專門的CStringACStringW類。這些是相應的ASCII和寬版本CString,具體取決於您是否使用UNICODE標誌進行編譯。所以你可以使用:

CString your_string = "blah" 
CStringW wide_string = your_string; 

得到一個廣泛的字符串版本。

1
LPCWSTR pstr; 
CString cstrTemp; 

... 

pstr = cstrTemp.AllocSysString(); 

AllocSysString將返回一個BSTR類型的字符串,它可以直接轉換爲LPCWSTR。

+0

「BSTR」不能轉換爲「LPCWSTR」。這兩種字符串類型都有不同的語義。例如,'nullptr'總是一個有效的'BSTR'。 'LPCWSTR'不作任何保證。另外,需要清理一個'BSTR'來調用'SysFreeString'。你的代碼沒有顯示這一點,你的解釋也沒有注意到這一點。由於OP要求** const **指針,因此他們甚至不需要副本。在這種情況下,內置的'運算符LPCTSTR()'已經足夠了。而且,除非你需要一個'BSTR',否則不要只使用一個,因爲你不知道還有什麼要做。對不起,-1。 – IInspectable 2016-06-03 13:11:02