Как использовать mciSendString (путь воспроизведения, 0,0,0) с путем exe?

Я использую mciSendString("play path repeat",0,0,0) для воспроизведения музыки в своем проекте, и я использую его специально для одновременного воспроизведения нескольких звуков.

Проблема в том, что я хочу поместить звуки в путь к исполняемому файлу, поэтому я использовал функцию для получения пути к exe.

string ExePath() {
    char buffer[MAX_PATH];
    GetModuleFileName( NULL, buffer, MAX_PATH );
    string::size_type pos = string( buffer ).find_last_of( "\\/" );
    return string( buffer ).substr( 0, pos);
}

но mciSendString() занимает LPCSTR поэтому я попробовал следующее

string music_cmd="play "+ExePath()+"\\war1.mp3 repeat";
mciSendString(music_cmd.c_str(),0,0,0);

Программа работает без ошибок, но не воспроизводит звук. Как я могу решить эту проблему?


person Ali Essam    schedule 19.12.2012    source источник
comment
Вы пробовали использовать отладчик?   -  person DuXeN0N    schedule 19.12.2012
comment
Вы можете посмотреть этот пример. Также вам, возможно, следует использовать mciSendcommand вместо mciSendString и использовать следующий пример от Microsoft.   -  person Stan    schedule 19.12.2012
comment
@DuXeN0N да, и строка содержит точный путь к файлу mp3   -  person Ali Essam    schedule 19.12.2012
comment
@Stan Первый пример на С#, а второй также использует LPSTR, единственная проблема, с которой я столкнулся, заключается в том, что я не могу правильно объединить ExePath с именем файла в LPCSTR, но он отлично работает, если я указал файл имя напрямую, например, mciSendString (play c:\\war1.mp3,0,0,0);   -  person Ali Essam    schedule 19.12.2012
comment
@AliEssam Неважно, какой язык использовать для одного и того же API. Суть в том, что вам нужно сначала open файл и использовать кавычки вокруг его пути/имени, а во-вторых, вы можете play псевдоним, упомянутый в строке open. Пример Microsoft делает то же самое. Также нет большой разницы между LPCSTR или LPSTR, за этим просто стоит модификатор const.   -  person Stan    schedule 19.12.2012
comment
@Stan проблема заключалась в преобразовании строки (возвращенной из функции) в LPCSTR, и она отлично работает без использования строк.   -  person Ali Essam    schedule 19.12.2012
comment
Я понял, что могу использовать mciSendString(play \\war1.mp3,0,0,0); , это воспроизводит звук непосредственно из пути Exe   -  person Ali Essam    schedule 19.12.2012
comment
@AliEssam LPCSTR — это не что иное, как const char *, вы можете получить его от string до c_str(). К сожалению, вы игнорируете официальные и неофициальные инструкции.   -  person Stan    schedule 19.12.2012
comment
@AliEssam Я думаю, что функция возвращает имя файла + обратную косую черту. Попробуйте: return string( buffer ).substr( 0, pos-1);   -  person Mehmed    schedule 15.08.2015


Ответы (1)


в пути не должно быть пробелов, если вы используете такой путь: C:\music\music 2.mp3 это не сработает. чтобы он работал, удалите пробел или создайте новый путь без пробелов, как показано ниже: C:\music\music2.mp3

Другие наблюдения: путь должен быть меньше 255 символов, относительный путь не будет работать (он работает при компиляции, но при запуске программы на другом компьютере не будет работать), не должно быть пробелов, иначе произойдет сбой.

есть обходной путь, который вы можете сделать, и он прост, вы сможете играть с точками и пробелами на пути

моя выглядит следующим образом:

path = Application.StartuPath & `\whateverMusic.mp3`
path = Chr(34) & path & Chr(34)
mciSendString("Open " & path & " alias " & oName, Nothing, 0, 0)
mciSendString("Play " & oName, Nothing, 0, 0)

Public Property Name As String
    Set(value as String)
         oName = value
    End Set
    Get
         Return oName
    End Get
End Property

Отсюда: https://www.youtube.com/watch?v=UWLTegpOuB0.

person rafael    schedule 15.08.2015