如何让mciSendString同时使用变量和空间
How Do I Get mciSendString to Work With Both Variables and Spaces?
在谷歌的帮助下,我创建了一个程序,可以在我的音乐目录中播放音乐并支持空格。然而,我不想一直对歌曲名称进行硬编码,所以我想知道是否可以在程序运行时用变量和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++的新手。然而,我不想让这个项目没有完成,我希望在继续前进之前完成它
我将非常感谢任何解决方案、帮助或提示。如果你想让我更具体或提供更多信息来帮助你制定答案,我很乐意这样做
非常感谢。
编辑:我执行了伊桑的建议。在添加了一些内容并添加了他的建议后,我的程序在输入我想要的歌曲名称后不久就停止了工作。我试过调试,它报告:
"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++ 中正确声明 extern 变量
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在命名空间中定义变量
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 命名空间内C++变量声明
- C++从 std::async 函数读取命名空间中的全局变量标志
- 在命名空间中声明变量
- 如何在命名空间中初始化外部变量
- 无法在命名空间范围内分配变量
- 在命名空间中定义变量,但在测试中获取空值
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- C++:.cpp中"Redeclare"外部命名空间变量
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- 在同一命名空间中声明变量和函数是否出错?[C++]
- 作用域中定义的变量与注入该作用域的命名空间变量
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 获取封装在命名空间中的静态变量地址
- C :将外部链接与未命名的名称空间使用常数变量