2009-08-24 7 views
0

次のコードについては、MFCによって書かれていますが、テスト時に、私は単純なプログラムを実行します。通常の場合はありません。プログラムは私に失敗したメッセージを返します。 「ファイルを再生できません:[PATH]」です。MFCについてCFileDialog問題

しかし、私は、ファイル(ダイアログを形成する選択しない)に固定すれば、それは仕事で、私は問題を見つけることができない、私はいくつかの人が修正するために私を助けることができると思います。..

私の貧弱な言い訳してください英語。おかげでたくさんの..コードについて

:BASS_StreamCreateFile(bass.dll)について

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

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へのポインタです。

filePathをCStringに渡すと、コンパイラはchar*に変換する必要があることを知らないため、実際に文字列を渡すことはありません。

fileconst char*と宣言されている場合は、この問題は発生しません。
filePath.GetBuffer(1)を試してみてください。

+0

filePath.GetString()がより良い選択肢になります。 – Goz

+0

@ Gozの場合、ユーザーのMFCのバージョンによって異なります。私はその方法を知らなかった。 –

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

// ... 
関連する問題