2012-03-29 4 views
0

Ich versuche, einen Audioplayer zu machen, der .wav-Dateien abspielt. Ich habe eine Funktion ReadWaveFile (CString szFilename) zum Lesen der Wave-Daten der Datei in die WAVEHDR-Struktur geschrieben. In dieser Funktion.wav Player: MMioOpen API

BOOL CWavePlay::ReadWaveFile(CString szFilename) 
{ 
    hmmio = mmioOpen((LPTSTR)&szFilename,NULL,MMIO_READ); 
    ASSERT(hmmio);  //error here: hmmio=0x00000000 
    if(hmmio==0) 
     return FALSE; 
     .... 
} 

MmioOpen immer wiederkehr 0, wenn ich eine Filepath an diese Funktion übergeben Sie die angegebene Datei zu öffnen. Und was mich verwirrt ist, wenn ich den Dateipfad explizit in mmioOpen API überlasse, funktioniert der Code; ein gültiges Handle wird zurückgegeben. kann einige Körper erklären, warum passiert das?

+0

das Problem ist gelöst, wenn ich den Code geschrieben haben: hmmio MmioOpen = ((LPTSTR) (LPCTSTR) szFileName, NULL, MMIO_READ); – ckram

Antwort

0

Was passiert, wenn Sie

MessageBox(NULL,(LPTSTR)&szFilename,"Foo",MB_ICONINFORMATION); 

sagen Wenn Strings Systemfunktionen vorbei müssen Sie den Zeiger auf den rohen String holen. Zum Beispiel, wenn Sie ein std :: string-Objekt zu bauen Sie Ihren Weg verwenden möchten, müssen Sie

mmioOpen(filename.c_str(),NULL,MMIO_READ); 

Ihre Besetzung von CString * zu LPTSTR geht davon aus sagen, geht davon aus, dass ein CString binär ist mit einem LPTSRT kompatibel, das ist nicht der Fall. Wenn Sie LPCTSTR auf szFilename schreiben, rufen Sie einen in CStrings definierten Darstellungsoperator auf, der das Format in das entsprechende Format konvertiert. Hast du es nur versucht

hmmio = mmioOpen((LPCTSTR)szFilename,NULL,MMIO_READ); 

Die letzte Besetzung tut nichts wirklich hier, also sollte es genug sein.