簡體   English   中英

Windows上的C ++ std :: string轉換問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM