О проблеме MFC CFileDialog

Что касается следующего кода, он написан MFC, но во время тестирования я запускаю простую программу, у меня не будет нормального случая, программа вернет мне сообщение об ошибке, сообщение "Не удается воспроизвести файл:[ДОРОЖКА]".

но если я исправил файл (не выбирая из диалогового окна), это работа, я не могу выяснить проблему, я надеюсь, что некоторые люди могут помочь мне исправить..

прошу прощения за мой плохой английский. большое спасибо..

О коде:

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

3 ответа

CFileDialog имеет известные проблемы в VC6 со структурами, которые ему нужны. Это было исправлено в VC 7.x.

// ...

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

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

file Параметр является указателем на void.

Когда вы проходите filePath что CString, вы на самом деле не передаете строку, потому что компилятор не знает, что он должен преобразовать ее в char*,

Если file был объявлен как const char* у тебя не было бы этой проблемы.
Попробуйте пройти filePath.GetBuffer(1),

Другие вопросы по тегам