Я пытаюсь опубликовать сообщение в API WIN32, чтобы открыть файл WAV. Я могу сделать это, установив параметр LPARAM в L "C: /path/file.wav" Это работает отлично! Тем не менее, я пытаюсь использовать диалоговое окно для создания строки в пути к файлу. Функция OpenFileDialog может возвращать выбранный путь к файлу как тип данных LPSTR, который звучит идеально! Однако этот путь к файлу распознается как путь к файлу Windows, который состоит из обратных косых черт. Поскольку эти обратные косые черты не экранируются или не заменяются для косой черты, компилятор начинает плакать из-за неправильного сформированного универсального символьного имени. Следовательно, кажется тривиальным заменить все \ в пути к файлу LPSTR для \ или /. Я пытался сделать это несколькими способами, но ничего не работает.Замена обратной косой черты двойной обратной косой чертой или косой чертой в пути к файлу LPSTR
wchar_t* SelectAudioFile(HWND windowHandle) {
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = windowHandle;
ofn.lpstrFile = (LPWSTR)szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = L"Waveform Audio File Format (*.wav)\0*.wav\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE) {
CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
MessageBox(windowHandle,ofn.lpstrFile,0,0);
}
//Here the backslash should be escaped or replaced.
const wchar_t * currentPath = ofn.lpstrFile; //This is a LPSTR
wchar_t * newPath;
int filePathLength = sizeof(currentPath);
for (int i=0; i < filePathLength; i++) {
if (currentPath[i] == "\\") {
newPath[i] = "\\\\";
} else {
newPath[i] = filePath[i];
}
}
return newPath;
}
Следующая строка будет опубликовать сообщение о том, чтобы открыть определенный файл на пути
PostMessageW(hwnd, WMA_OPEN, 0, (LPARAM)SelectAudioFile(hwnd));
Таким образом, заменив LPARAM со статическим Filepath работает!
Как заменить обратную косую черту в пути к файлу?
Спасибо миллион раз!
Эта проблема для меня не имеет большого значения. Вам не нужно избегать задержек в строках, возвращаемых функциями API. Это требуется только для строк * литералов *. Строка, возвращаемая в 'OPENFILENAME.lpstrFile' с помощью' GetOpenFileName', может использоваться напрямую, без изменений. Он гарантированно является допустимым путем к файлу. Скорее, сообщения об ошибках компилятора являются результатом несоответствия между широкими и узкими типами символов. Вы уверены, что 'UNICODE' и' _UNICODE' определены для вашей сборки? Я замечаю, что вы вызываете 'W' версию * некоторых * API, но не * всех * из них –
Когда я напрямую использую возвращаемую строку, консоль не дает никаких ошибок. Но wav-файл не воспроизводится! Однако, когда я даю ввести путь к файлу вручную с помощью косой черты, он начинает играть. Таким образом, вы бы подумали: функция не возвращает строку !? Этот аргумент недействителен, когда я печатаю его в окне сообщений. Однако, когда я решил распечатать его в консоли с помощью wcout << L ", путь будет« << returnLPWSTR << L »\ n"; путь пуст. –
Возможно, изменение с LPWSTR на LPCWSTR выполнит эту работу !? Но как это можно сделать? –