2009-08-24 112 views
0

關於下面的代碼,它是由MFC編寫的,但是在測試的時候,我運行簡單的程序,我不會得到一個正常的情況,程序會向我返回一條失敗的消息,消息是「無法播放文件:[PATH]」。關於MFC CFileDialog問題

,但如果我固定的文件(不選擇窗體對話框),它是工作,我不能找出問題,我希望有人能幫助我解決..

請原諒我那可憐的英語。非常感謝..

關於代碼:

// 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); 

關於BASS_StreamCreateFile(bass.dll):

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

關於BASS_MusicLoad(bass.dll):

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

回答

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

file參數是一個指向void的指針。

當您傳遞的是CString的filePath時,由於編譯器不知道必須將其轉換爲char*,所以實際上並不傳遞字符串。

如果file被宣佈爲const char*您不會有這個問題。
嘗試通過filePath.GetBuffer(1)

+0

filePath.GetString()會是一個更好的選擇,IMO。 – Goz 2009-08-24 10:56:47

+0

@Goz,它取決於用戶具有的MFC版本。我不知道那種方法。 – 2009-08-24 11:15:40

0

CFileDialog已知VC6下的問題及其所需的結構。這在VC 7.x中得到了修復。

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(); 

// ...