我正在尝试向 WIN32 API 发布消息以打开 WAV 文件。我可以通过将 LPARAM 参数设置为 L"C:/path/file.wav" 来做到这一点,这非常有效!但是,我一直在尝试使用对话框生成文件路径的字符串。OpenFileDialog 函数可以将选定的文件路径作为 LPSTR 数据类型返回,这听起来很完美!但是,此文件路径被识别为 Windows 文件路径,因此由反斜杠组成。由于这些反斜杠没有转义或替换为正斜杠,因此编译器会因为格式不正确的通用字符名称而开始哭泣。因此,将 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 是可行的!
我应该如何替换文件路径中的反斜杠?
感谢一百万次!