2016-04-19 5 views
0

私は自分の音楽ディレクトリで音楽を再生し、スペースをサポートするプログラムを作成しました。これはGoogleの助けを借りて実現しました。しかし、私は曲名をハードコーディングし続けたくないので、ファイル名を変数に置き換えることができ、プログラムが実行されるときにstd :: cin変数を置き換えることができるのだろうかと思います。しかし、名前にスペースがある曲を再生できるようにしたいのですが、です。私はmciSendStringのラッパー関数を作成しました(これは1つに数えられますか?)mciSendStringのラッパー関数を作成しました。これを再生するために "name"パラメーターを渡すことを試みています。しかし、LPCWSTRとstd :: stringの合併症のために、私はこれを実装するのが難しいです。変数とスペースの両方でmciSendStringを使用するにはどうすればよいですか?

は、ここに私の現在の音楽機能です:

私は次のようにそれになりたい何
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); 
    } 
} 

:私は、メイン内の変数またはいくつかの他の機能とstd ::にCINになるだろう

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

その変数。私はまた、あなたが望むなら、それは私が実装し、まだ持っている何かである「dwExtraFlags」引数を無視することができることに言及したいと思います

Music(strNameOfSong,0) 

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

その後、私のような音楽を呼ぶだろう。

とにかく、私はC++を初めて使っているので、これを実装するのに本当に感謝しています。しかし、私はこのプロジェクトを未完成の状態にしておきたいと思っています。

解決方法、ヘルプ、またはヒントをお待ちしております。私がより具体的になるようにしたり、答えを公式化するのに役立つ情報を提供したいなら、私はそうすることがうれしいです。

ありがとうございました。

EDIT:私はEthanの提案を実装しました。いくつかのものを追加して彼の提案を加えた後、私のプログラムは、私が欲しい曲の名前を入力した直後に動作しなくなります。私はデバッグしようとしました:

"Program.exeで0x00047430で例外がスローされました: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

あなたは空白を含む入力文字列から曲の名前を置き換えようとしていますか? –

+0

ye ['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)を探してください。この場合、 'std :: getline(cin、strNameOfSong);'これはコンソール上の行の最後までをすべて取得するので、*(すべて実行します) 'strNameOfSong'は"(すべて私がやる)私はあなたのために "と等しくなります。 – user4581301

+0

はい、イーサンです。 –

答えて

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

'mciSendString(songFile.c_str()、...)'は 'UNICODE'が定義されていない場合にのみコンパイルされることに注意してください。' mciSendString() 'は' TCHAR * '入力を期待しているからです。 'std :: string'は' TCHAR'の代わりに 'char'を使用するので、' std :: string'と 'mciSendStringA()'を使い、 'std :: wstring'と' mciSendStringW() 'を使う方が安全です。 –

+0

はい@RemyLebeauあなたはUNICODEについて正しいです。定義スイッチ(#ifdef UNICODE)を使用して、異なるコードを選択してエラーを回避します。 –

関連する問題