Как мне заставить mciSendString работать как с переменными, так и с пробелами?

Благодаря помощи Google я создал программу, которая воспроизводит музыку в моем музыкальном каталоге и поддерживает пробелы. Однако я не хочу продолжать жестко кодировать названия песен, поэтому мне интересно, могу ли я заменить имя файла на переменную и std :: cin, когда моя программа запущена. Тем не мение, Я также хочу иметь возможность играть песни, в названиях которых есть пробелы. Я сделал функцию-обертку (я думаю, что это будет считаться как единица?) Для mciSendString, и я пытаюсь передать ей параметр «name» для воспроизведения. Однако из-за сложностей с LPCWSTR и std :: string, между прочим, у меня возникают трудности с реализацией этого.

Вот моя текущая музыкальная функция:

 void Music(std::string strSongName,DWORD dwExtraFlag)
{

MCIERROR me =
mciSendString(TEXT("open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\song name.mp3\""" type mpegvideo alias song1"),
NULL, 0, 0);

/*
note that I want to be able to play songs
with spaces in their name
*/

if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}

На что я хочу, чтобы это было похоже:

 void Music(std::string strName,DWORD dwExtraFlag)
{

MCIERROR me =
mciSendString(TEXT("open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\STRNAMEVARIABLEHERE.mp3\""" type mpegvideo alias song1"),
NULL, 0, 0);

/*
note that I want to be able to play songs
with spaces in their name
*/

if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}

Затем я сделал бы переменную в main или какой-нибудь другой функции и вставил бы std :: cin в эту переменную.

std::string strNameOfSong = "";
std::cin >> strNameOfSong;

Тогда я бы назвал музыку как:

Music(strNameOfSong,0)

Я также хотел бы отметить, что вы можете игнорировать аргумент «dwExtraFlags», если вы хотите, это то, что мне еще предстоит реализовать.

В любом случае, я был бы очень признателен за помощь в реализации этого, поскольку я новичок в C ++. Однако я не хочу оставлять этот проект незавершенным и хочу завершить его, прежде чем двигаться дальше.

Буду очень признателен за любые решения, помощь или советы. Если вы хотите, чтобы я был более конкретным или предоставил дополнительную информацию, чтобы помочь вам сформулировать ответ, я был бы рад сделать это.

Большое спасибо.

РЕДАКТИРОВАТЬ: Я выполнил предложение Итана. После добавления некоторых вещей и добавления его предложения моя программа перестает работать вскоре после ввода названия песни, которую я хочу. Я попытался отладки, и он сообщает:

«Исключение, выброшенное в 0x00047430 в Program.exe: 0xC0000005: расположение записи нарушения доступа 0x6563696E.»

Вот что я добавил в свою основную функцию (кроме предложения Этана):

  static std::string strSongName = "";
std::cin >> strSongName;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Music, &strSongName, 0, 0);
// The above is to createthread so I can play music while doing other things

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

Еще одно небольшое изменение, которое я внес в предложение Этана:

MCIERROR me =
mciSendString((LPCWSTR)(songFile.c_str()), NULL, 0, 0);

(Я набрал текстовый файл SongFile, поскольку он выдавал мне ошибки)

Я также изменил пример пути назад к нормальному.

EDIT2:

Исправлено исключение! Это потому, что я (глупым образом) забыл разыменовать указатель на «strSongName». Однако, похоже, что после пробела все еще не распознано, как я его отлаживал. Кроме того, кажется, что песни не воспроизводятся, даже если у них нет пробела, и да, я тоже добавляю .mp3.

0

Решение

Как насчет этого?

void Music(std::string strName,DWORD dwExtraFlag)
{
std::string songFile = "open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\";
songFile += strName + "\" type mpegvideo alias song1";

MCIERROR me =
mciSendString(songFile.c_str(), NULL, 0, 0);

/*
note that I want to be able to play songs
with spaces in their name
*/

if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]