2012-02-13 3 views
0

Я новый участник и присоединился к этому сайту после обращения к нему много раз, когда я застрял в некоторых проблемах с программированием. Я пытаюсь закодировать медиа-плеер (Win32 SDK VC++ 6.0) для моего проекта в колледже, и я застрял. Я искал на разных форумах и msdn и, наконец, приземлился на функцию GetShortPathName, которая позволяет мне играть через папки и файлы, у которых есть пробелы в их именах. Я буду вставлять код здесь, поэтому будет намного понятнее, что я пытаюсь сделать.воспроизведение файлов после их приема через открытое диалоговое окно

case IDM_FILE_OPEN : 
    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = hwnd; 
    ofn.lpstrFilter = "Media Files (All Supported Types)\0*.avi;*.mpg;*.mpeg;*.asf;*.wmv;*.mp2;*.mp3\0" 
             "Movie File (*.avi;*.mpg;*.mpeg)\0*.avi;*.mpg;*.mpeg\0" 
             "Windows Media File (*.asf;*.wmv)\0*.asf;*.wmv\0" 
             "Audio File (*.mp2;*.mp3)\0*.mp2;*.mp3\0" 
             "All Files(*.*)\0*.*\0"; 
        ofn.lpstrFile = szFileName; 
        ofn.nMaxFile = MAX_PATH; 
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_CREATEPROMPT; 
        ofn.lpstrDefExt = "mp3"; 

        if(GetOpenFileName(&ofn)) 
        { 

         length = GetShortPathName(szFileName, NULL, 0); 
         buffer = (TCHAR *) malloc (sizeof(length)); 
         length = GetShortPathName(szFileName, buffer, length); 

         for(i = 0 ; i < MAX_PATH ; i++) 
         { 
          if(buffer[i] == '\\') 
           buffer[i] = '/'; 
         } 

         SendMessage(hList,LB_ADDSTRING,0,(LPARAM)buffer); 
         mciSendString("open buffer alias myFile", NULL, 0, NULL); 
         mciSendString("play buffer", NULL, 0, NULL); 
        } 

        return 0; 

с помощью функции GetShortPathName я получаю путь, как: D: /Mp3z/DEEPBL~1/03SLEE~1.mp3 Собираем этот путь непосредственно в Play кнопки случае

mciSendString("open D:/Mp3jh/DEEPBL~1/03SLEE~1.mp3 alias myFile", NULL, 0, NULL); 
mciSendString("play myFile", NULL, 0, NULL); 

открывает файл и играет отлично. Но как только я пытаюсь открыть и воспроизвести его через диалоговое окно с открытым файлом, ничего не происходит. Любой вход оценивается.

+0

Почему, по-вашему, вам нужно короткое название пути? –

+1

Не используйте краткое имя. Просто избегайте пробелов в имени, добавляя кавычки к имени файла: '' open \ "path/to/file/с пробелами в.mp3 \" alias myFile "' –

ответ

0

Похоже, проблема в том, что вы передаете имя переменной buffer функции mciSendString как строки, а не передавая содержимое буфера.

Вам нужно сцепить аргументы, которые вы хотите передать (open и alias myFile) с содержание из buffer.

Код также может быть значительно упрощен путем замены malloc на автоматический массив. Вам не нужно malloc, потому что вам это не нужно за пределами области блока. (И вы не должны использовать malloc в C++ код в любом случае, использование new[] вместо этого.)

Вот модифицированный фрагмент кода, показанный на ваш вопрос:
(Внимание: изменения, сделанные с использованием только мои глаза, как компилятор ! Обращаться с осторожностью.)

if(GetOpenFileName(&ofn)) 
{ 
    // Get the short path name, and place it in the buffer array. 
    // We know that a short path won't be any longer than MAX_PATH, so we can 
    // simply allocate a statically-sized array without futzing with new[]. 
    // 
    // Note: In production code, you should probably check the return value 
    // of the GetShortPathName function to make sure it succeeded. 
    TCHAR buffer[MAX_PATH]; 
    GetShortPathName(szFileName, buffer, MAX_PATH); 

    // Add the short path name to your ListBox control. 
    // 
    // Note: In C++ code, you should probably use C++-style casts like 
    // reinterpret_cast, rather than C-style casts! 
    SendMessage(hList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(buffer)); 

    // Build the argument string to pass to the mciSendString function. 
    // 
    // Note: In production code, you probably want to use the more secure 
    // alternatives to the string concatenation functions. 
    // See the documentation for more details. 
    // And, as before, you should probably check return values for error codes. 
    TCHAR arguments[MAX_PATH * 2]; // this will definitely be large enough 
    lstrcat(arguments, TEXT("open")); 
    lstrcat(arguments, buffer); 
    lstrcat(arguments, TEXT("alias myFile")); 
    // Or, better yet, use a string formatting function, like StringCbPrintf: 
    // StringCbPrintf(arguments, MAX_PATH * 2, TEXT("open %s alias myFile"), 
    //    buffer); 

    // Call the mciSendString function with the argument string we just built. 
    mciSendString(arguments, NULL, 0, NULL); 
    mciSendString("play myFile", NULL, 0, NULL); 
} 

Обратите внимание, что, как выше показывает код, работа со строками в стиле с (символьные массивы) реальная боль в заднице. C++ обеспечивает лучшую альтернативу в виде класса std::string. Вы должны решительно рассмотреть это. Чтобы вызвать функции Windows API, вам все равно потребуется строка стиля C, но вы можете получить один из них, используя метод c_str класса std::string.

+0

Спасибо, ребята. Я использовал strcpy и strcat, и это сработало. Спасибо Коди Грей за код. Это похоже на то, что я сделал. – Salil

Смежные вопросы