【问题标题】:How Do I Get mciSendString to Work With Both Variables and Spaces?如何让 mciSendString 同时使用变量和空格?
【发布时间】:2016-08-12 05:50:43
【问题描述】:

在 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,因为它给了我错误)

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

EDIT2:

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

【问题讨论】:

  • 你是说,你试图从可能包含空格的输入字符串中替换歌曲的名称?
  • 求你std::getline。在这种情况下,std::getline(cin, strNameOfSong); 这将抓取控制台上的所有内容,直到行尾,所以如果您输入 (我所做的一切)我为您做的事情 并按 Enter,strNameOfSong 将等于“(我所做的一切)我为你做”。
  • 所以比如“open a.mp3”可以播放,但是“open \"a b.mp3\"”不能播放?

标签: c++ visual-studio path console-application mcisendstring


【解决方案1】:

这个怎么样?

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

【讨论】:

  • 请注意,mciSendString(songFile.c_str(), ...) 仅在未定义 UNICODE 时才会编译,因为 mciSendString() 需要 TCHAR* 输入。 std::string 使用char 而不是TCHAR,因此将mciSendStringA()std::stringmciSendStringW()std::wstring 一起使用会更安全。
  • 是的@RemyLebeau,您对 UNICODE 的看法是正确的。应使用定义开关(#ifdef UNICODE)选择不同的代码以避免错误。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多