.wav Player: mmioOpen API
Я пытаюсь сделать аудио плеер, который воспроизводит файлы.wav. Я написал функцию ReadWaveFile(CString szFilename) для чтения волновых данных файла в структуру WAVEHDR. В этой функции
BOOL CWavePlay::ReadWaveFile(CString szFilename)
{
hmmio = mmioOpen((LPTSTR)&szFilename,NULL,MMIO_READ);
ASSERT(hmmio); //error here: hmmio=0x00000000
if(hmmio==0)
return FALSE;
....
}
mmioOpen всегда возвращает 0 всякий раз, когда я передаю путь к файлу этой функции для открытия указанного файла. И что сбивает меня с толку, так это когда я передаю filepath явно в mmioOpen API, код работает; т.е. верный дескриптор возвращается. Может ли какое-то тело объяснить, почему это происходит?
1 ответ
Что будет когда ты скажешь
MessageBox(NULL,(LPTSTR)&szFilename,"Foo",MB_ICONINFORMATION);
При передаче строк системным функциям вам потребуется подобрать указатель на необработанную строку. Например, если вы хотите использовать объект std::string для построения вашего пути, вам нужно будет сказать
mmioOpen(filename.c_str(),NULL,MMIO_READ);
Ваше приведение предполагает, что из CString* в LPTSTR предполагается, что CString двоично совместима с LPTSRT, что не соответствует действительности. Когда вы пишете LPCTSTR для szFilename, вы вызываете оператор приведения, определенный в CStrings, который преобразует его в соответствующий формат. Ты пробовал только что
hmmio = mmioOpen((LPCTSTR)szFilename,NULL,MMIO_READ);
Последний актерский состав не делает ничего реального, поэтому этого должно быть достаточно.