如何让mciSendString同时使用变量和空间

How Do I Get mciSendString to Work With Both Variables and Spaces?

本文关键字:变量 空间 mciSendString      更新时间:2023-10-16

在谷歌的帮助下,我创建了一个程序,可以在我的音乐目录中播放音乐并支持空格。然而,我不想一直对歌曲名称进行硬编码,所以我想知道是否可以在程序运行时用变量和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);
}
}