[英]C++ std::string conversion problem on Windows
這是我的程序:
bool Open(std::string filename)
{
...
HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
...
}
錯誤:'CreateFileW':無法將參數1從'const char *'轉換為'LPCWSTR'指向的類型不相關; 轉換需要reinterpret_cast,C風格的轉換或函數式轉換
問題出在哪兒?
std :: string由一個char數組組成,因此c_str
函數返回一個const char*
。
LPCWSTR
是指向常量寬字符串的長指針,換句話說就是const wchar_t*
。
所以你有幾個選擇。 要么將文件名作為寬字符串(std :: wstring)獲取,要么指定您想要非寬版本的CreateFile。 這可以通過調用CreateFileA或在項目設置中禁用UNICODE來完成。
CreateFile是一個宏,它根據是否啟用了unicode,解析為CreateFileA(char版本)或CreateFileW(寬char版本)。
您已指定std :: string,其字符類型為char
。 並且您正在使用CreateFile()
的代碼必須在預處理器符號UNICODE
的定義下進行編譯,因為它選擇了實際的底層函數CreateFileW()
。
要么擺脫UNICODE
定義,要么明確使用CreateFileA()
。
看起來您正在編譯啟用Unicode支持。 您可能想要將其關閉,或者如果不使用std :: wstring而不是std :: string。
正如其他人所建議的那樣,您可以直接調用CreateFileA,但我強烈建議您不要這樣做 - 最終會得到一個無法管理的Unicode和非Unicode函數調用集合。
問題是你試圖將char *傳遞給需要wchar_t *的函數
您可以編寫一個函數將字符串轉換為wstring:
wstring Widen( const string& str );
然后你可以像這樣調用CreateFile:
HANDLE hFile = CreateFile( Widen(filename).c_str(), etc. );
我見過的另一種技術是根據Unicode設置有條件地將tstring定義為字符串或wstring,並在代碼中的任何地方使用tstring。
bool Open(tstring filename)
{
...
HANDLE hFile = CreateFile( filename.c_str(), etc. );
...
}
我擔心這是一個棘手的問題,而對你來說最好的解決方案只有你能決定。 但是,我同意Neil並避免直接調用CreateFileA,因為這最終會讓你陷入混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.