由於我不能將LPCSTR從一個函數傳遞到另一個函數(數據被更改),我嘗試將它作爲字符串傳遞。無法從'std :: string'轉換爲'LPSTR'
但後來我需要再次將其轉換回LPSTR。嘗試轉換時,我收到上述錯誤:
cannot convert from 'std::string' to 'LPSTR'
我該如何解決這個問題?
由於我不能將LPCSTR從一個函數傳遞到另一個函數(數據被更改),我嘗試將它作爲字符串傳遞。無法從'std :: string'轉換爲'LPSTR'
但後來我需要再次將其轉換回LPSTR。嘗試轉換時,我收到上述錯誤:
cannot convert from 'std::string' to 'LPSTR'
我該如何解決這個問題?
這只是因爲你應該使用std::string::c_str()
方法。
但這涉及const_cast
在特定的情況,因爲c_str()
返回const char *
不能分配給非恆定LPSTR
。
std::string str = "something";
LPSTR s = const_cast<char *>(str.c_str());
但你必須確保的str
壽命會更長那是LPTSTR
變量。
另一提到,如果代碼編譯爲符合Unicode的代碼,則類型LPTSTR
和std::string
不兼容。您應該改用std::wstring
。
重要注意事項:如果將上面產生的指針s
從上面傳遞給試圖修改其指向的數據的函數,則會導致未定義的行爲。妥善處理它的唯一方法是如果你需要一個LPSTR
,這意味着字符串/可以修改複製串入一個非const緩衝區(例如,通過strdup
)
@Keynslug,最終解決了我的問題。但爲什麼這(const_cast :)可怕 – Simsons 2010-10-11 13:30:46
最後一段也是錯誤的,即使在Unicode版本中,LPSTR也是* always * char *。你在談論LPTSTR。 – 2010-10-11 13:42:01
@ereOn在提到答案時提及'const_cast',但爲什麼不提及。但爲什麼'const_cast
您是否在運行somestringvariablename.c_str()
? 這應該工作。
std::string c_str()上有一個功能。不過,我懷疑你不能在你的情況下使用std :: string。
如果OP調用Win32 API,他不能直接使用'std :: string'。 – 2010-10-11 14:49:18
我把它看作是他寫的兩個函數。因爲無論如何你都無法將std :: string傳遞給任何windows api函數。 – rerun 2010-10-11 15:04:25
LPSTR可以通過使用TCHAR(即在tchar.h中找到)來代替。所以,如果你有一個std :: string,你可以使用std :: string :: c_str()方法。
如果函數,你調用不寫入字符串,但只讀取它,那麼你可以簡單地使用string :: c_str方法。如果它要寫東西,那麼你可能應該通過調用string :: reserve()來確保你的字符串有足夠的空間。
。 std::string::c_str()
返回const
指針,你不能只是const_cast
它,並希望世界上一切都好,因爲它不是。字符串可能會以各種討厭的方式進行更改,並且您的原始std::string
將不會被忽略。
試試這個:
// myFunction takes an LPSTR
std::string cppString = "something";
LPSTR cString = strdup(cppString.c_str());
try {
myFunction(cString);
cppString = cString;
} catch(...) {
free(cString);
}
裹在字符串中的智能指針和獎勵積分(不要忘了定製刪除)擺脫try...catch
的。
如何嘗試轉換? – 2010-10-11 13:16:23