我試圖創建一個從OPENFILENAME對話框獲取文件路徑的函數。我的代碼看起來像這樣。OPENFILENAME對話框返回亞洲字母代替文件路徑
wstring src;
bool open()
{
const string title = "Select a File";
wchar_t filename[MAX_PATH];
OPENFILENAMEA ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Music (.mp3)\0*.mp3\0All\0*.*\0";
ofn.lpstrFile = LPSTR(filename);
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = title.c_str();
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameA(&ofn))
{
src = filename; //<----------Save filepath in global variable
return true;
}
return false;
}
一旦在評論排放置一個斷點,我可以檢查「SRC」和「文件名」,它在這一點上是對我來說,亞裔無法辨認字母的價值。爲什麼會發生?這是一個轉換問題嗎?
編輯:
多虧了快速回復和少數意見,代碼是現在功能齊全。感謝Hans Passant提供了一個非常直接的解決方案,同時也非常感謝Cody Gray重寫函數,解釋錯誤,並且告訴我應該如何處理它。由於我仍然在學習winapi的第一步,這些信息將在未來的項目中爲我提供很好的幫助。
嘗試'char filename [MAX_PATH];'而不是wchar_t –
LPSTR轉換非常邪惡,這阻止了編譯器告訴你,你做錯了。然而,沒有阻止你做錯了。改爲使用OPENFILENAMEW和GetOpenFileNameW,使用L「blabla」生成寬字符串文字。 –
'GetOpenFileNameA'是'GetOpenFileName'的ANSI子函數,所以你應該檢查你的代碼不是以Unicode編譯的。你應該使用'GetOpenFileName'而不是'GetOpenFileNameA',好的子功能的選擇將自動完成。 – Gwen