2009-08-24 5 views
0

Über den folgenden Code wird es von MFC geschrieben, aber in der Testzeit, ich führe das einfache Programm, ich werde nicht einen normalen Fall erhalten, das Programm wird eine fehlgeschlagene Nachricht an mich zurückgeben, die Nachricht ist "Kann Datei nicht abspielen: [PATH]".Über den MFC CFileDialog Problem

aber wenn Sie mir die Datei festgelegt (nicht wählen Sie die den Dialog bilden), ist es Arbeit, ich das Problem nicht herausfinden können, ich hoffe, einige Leute mich .. zu beheben helfen kann

bitte meine schlechte Entschuldigung Englisch. Dank viel ..

über den Code:

// Check Bass Version 
if (HIWORD(BASS_GetVersion()) != BASSVERSION) { 
    this->MessageBox(_T("An incorrect version of BASS.DLL was loaded"), _T("Error!"), MB_ICONSTOP | MB_OK); 
    return; 
} 

// Start Bass 
if (!BASS_Init(-1, 44100, 0, NULL, NULL)) { 
    this->MessageBox(_T("Can't initialize device"), _T("Error!"), MB_ICONSTOP | MB_OK); 
    return; 
} 

CString filePath = _T(""); 
CFileDialog dialog(true, _T("mp3"), _T("*.mp3"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER, _T("*.*|All File|*.mp3|MP3 File||"), NULL); 
if (dialog.DoModal() == IDOK) { 
    filePath = dialog.GetPathName(); 
} 

if (filePath == "") { 
    this->MessageBox(_T("Please select file first"), _T("Error!"), MB_ICONSTOP | MB_OK); 
    return; 
} 

//char * filePathChar = (char *) (LPCTSTR) filePath; 

DWORD channel; 
if (!(channel = BASS_StreamCreateFile(false, filePath, 0, 0, 0)) 
    && !(channel = BASS_MusicLoad(false, filePath, 0, 0, BASS_MUSIC_RAMPS | BASS_MUSIC_POSRESET | BASS_MUSIC_PRESCAN, 0))) { 
     this->MessageBox(_T("Can't play file:\n" + filePath), _T("Error!"), MB_ICONSTOP | MB_OK); 
     BASS_Free(); 
     return; 
} 

BASS_ChannelPlay(channel,false); 

über die BASS_StreamCreateFile (bass.dll):

HSTREAM BASS_StreamCreateFile(
    BOOL mem, 
    void *file, 
    QWORD offset, 
    QWORD length, 
    DWORD flags 
); 

über die BASS_MusicLoad (bass.dll):

HMUSIC BASS_MusicLoad(
    BOOL mem, 
    void *file, 
    QWORD offset, 
    DWORD length, 
    DWORD flags, 
    DWORD freq 
); 

Antwort

0
HMUSIC BASS_MusicLoad(
    BOOL mem, 
    void *file, // <-------- 
    QWORD offset, 
    DWORD length, 
    DWORD flags, 
    DWORD freq 
); 

Der file Parameter ist ein Zeiger auf void.

Wenn Sie filePath übergeben, die CString ist, übergeben Sie keine Zeichenfolge tatsächlich, da der Compiler nicht weiß, dass es in char* konvertieren muss.

Wenn file als const char* deklariert wurde, hätten Sie dieses Problem nicht.
Versuchen Sie, filePath.GetBuffer(1) zu übergeben.

+0

filePath.GetString() wäre eine bessere Wahl, IMO. – Goz

+0

@Goz, hängt davon ab, welche MFC-Version der Benutzer hat. Ich kannte diese Methode nicht. –

0

CFileDialog hat Probleme unter VC6 mit den Strukturen, die es benötigt. Dies wurde in VC 7.x behoben.

0
// ... 

if (filePath.IsEmpty()) { 
    this->MessageBox(_T("Please select file first"), _T("Error!"), MB_ICONSTOP | MB_OK); 
    return; 
} 

LPTSTR filename = filePath.GetBuffer(0); 

//char * filePathChar = (char *) (LPCTSTR) filePath; 

DWORD channel; 
if (!(channel = BASS_StreamCreateFile(false, filename, 0, 0, 0)) 
     && !(channel = BASS_MusicLoad(false, filename, 0, 0, BASS_MUSIC_RAMPS | BASS_MUSIC_POSRESET | BASS_MUSIC_PRESCAN, 0))) { 
       this->MessageBox(_T("Can't play file:\n" + filePath), _T("Error!"), MB_ICONSTOP | MB_OK); 
       BASS_Free(); 
       return; 
} 

filePath.ReleaseBuffer(); 

// ...