2014-08-28 70 views
-1

我打電話給返回LPWSTR(該字符串包含一個文件路徑)的C++方法,但我需要將其轉換爲LPSTR以繼續。C++中的字符串類型:如何將LPWSTR轉換爲LPSTR?

我從來沒有使用過C++,即使不同的字符串類型在這裏詳細解釋:http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc,我感到困惑。

當我投LPWSTRLPTSTR(應該等於LPSTR在我的應用程序中),我得到一個Unicode符號。雖然我猜這種情況在這種情況下不適用,但我不明白爲什麼它只返回一個字符,而不是將LPWSTR的所有雙字節字符以某種方式解釋爲1字節字符。我發現對WideCharToMultiByte函數的引用,這顯然可以將LPWSTR轉換爲std::string,而我又不能將其轉換爲LPSTR

那麼從LPWSTR獲得LPSTR有點簡單嗎?

+0

您不需要投射,您需要進行轉換。 http://msdn.microsoft.com/en-us/library/87zae4a3.aspx爲您的情況,使用CW2A – 2014-08-28 13:32:11

+1

請參閱[這個問題](http://stackoverflow.com/questions/13447756/issue-in-converting- wchar-t-to-char)作爲示例轉換代碼。 (這個人對轉換結果有疑問,但你應該專注於轉換本身。) – 2014-08-28 13:41:46

+0

我試着將CW2A pszA(lpwstr)分配給我的LPSTR變量,它工作正常。但它不能編譯,因爲我試圖在我的方法結束時將此變量作爲LPSTR返回。我可以使用CW2A返回我分配的價值嗎? – 2014-08-28 13:44:38

回答

1

將指針轉換爲另一種類型的指針不會改變或轉換原始指針指向的內容。

你應該可以撥打c_str()std::string,並將其轉換爲LPSTR,我想。因此,使用WideCharToMultiByte(如果確實如您所說,轉換爲std::string)並且對結果調用c_str。這會給你一個不變的字符串指針(LPCSTR)。您可以複製它(例如通過strdup)並將結果投射到LPSTR

返回的指針將引用使用strdup分配的字符串,因此在不再需要該字符串的某個點應傳遞給free

WideCharToMultiByte功能,我從熟悉的Windows API(見documentation)直接從一個寬字符字符串到多字節編碼字符串轉換不通過std::string去,但它仍然需要一個緩衝的分配持有輸出字符串。您也許可以使用它。

+0

它告訴我,如果我嘗試將類型爲「const char *」的值賦給「LPSTR」類型的實體這個。 – 2014-08-28 13:39:05

+0

啊,是的,它產生一個const指針;我已經更新了我的答案。 – davmac 2014-08-28 13:43:08

+0

hm,這會編譯並且不會產生任何錯誤,但是我仍然只有一個字符作爲輸出(對於我輸入的大多數路徑來說,它是一個管道)。爲什麼我可以將_strdup生成的副本投射到LPSTR,當我無法投射原始字符串? – 2014-08-28 14:13:04

相關問題