gpt4 book ai didi

c++ - 如何让 mciSendString 同时处理变量和空格?

转载 作者:行者123 更新时间:2023-11-28 05:43:05 26 4
gpt4 key购买 nike

感谢 Google 的帮助,我创建了一个程序,可以在我的音乐目录中播放音乐并支持空格。但是,我不想继续对歌曲名称进行硬编码,所以我想知道是否可以用变量替换文件名,并在我的程序运行时用 std::cin 替换变量。但是,我还希望能够播放名称中包含空格的歌曲。我为 mciSendString 创建了一个包装函数(我认为这算作一个?),并且我试图能够将“名称”参数传递给它以供播放。但是,由于 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++ 的新手。但是,我不想让这个项目未完成,我希望在继续之前完成它。

如果有任何解决方案、帮助或提示,我将不胜感激。如果您希望我更具体或提供更多信息来帮助您制定答案,我将很乐意这样做。

非常感谢。

编辑:我实现了 Ethan 的建议。添加一些东西并添加他的建议后,我的程序在输入我想要的歌曲名称后不久就停止工作。我试过调试并报告:

“在 Program.exe 中的 0x00047430 抛出异常:0xC0000005:访问冲突写入位置 0x6563696E。”

这是我添加到我的主要功能中的内容(除了 Ethan 的建议):

  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

调试,值似乎是正确的。但是,我突然得到那个异常并且应用程序停止工作。我怎么会出现访问冲突?

我对 Ethan 的建议做了另一个小改动:

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

(我对 SongFile 进行了类型转换,因为它给我错误)

我也把路径的例子改回正常了。

编辑 2:

修复了异常!这是因为我(以一种愚蠢的方式)忘记取消引用指向“strSongName”的指针。但是,在我调试它时,似乎仍然无法识别空格之后的任何内容。即使歌曲没有空间,它似乎也不会播放歌曲,是的,我也在添加 .mp3。

最佳答案

这个怎么样?

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

关于c++ - 如何让 mciSendString 同时处理变量和空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com