Я пытаюсь создать функцию, которая получает путь к файлу из диалогового окна 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», а также «имени файла», который в этот момент были, ко мне, неопознанных письма азиатского происхождения. Почему это происходит? Это проблема конверсии?
EDIT:
Благодаря быстрый ответ и несколько комментариев, код теперь полностью функциональны. Спасибо Hans Passant за очень прямое решение, а также огромное спасибо Коди Грей за переписывание функции, объяснение ошибки, а также дает мне урок о том, как ее следует обрабатывать. Поскольку я все еще делаю первые шаги, чтобы изучить winapi, эта информация будет хорошо служить мне в будущих программах.
Попробуйте 'char filename [MAX_PATH];' вместо wchar_t –
Листинг LPSTR довольно злой, что не позволило компилятору сказать вам, что вы делаете это неправильно. Однако это не помешало вам сделать это неправильно. Вместо этого используйте OPENFILENAMEW и GetOpenFileNameW, используйте L "blabla" для генерации широкого строкового литерала. –
«GetOpenFileNameA» - это подфункция ANSI «GetOpenFileName», поэтому вы должны проверить, что ваш код не создан как Unicode. И вы должны использовать «GetOpenFileName» вместо «GetOpenFileNameA», выбор хорошей подфункции будет выполнен автоматически. – Gwen