質問: "%02d.wav", random; //"std::string"から"LPCWSTR"へ変換できない // PlaySound(fname, NULL, SND_FILENAME | SND_SYNC); //Lfnameが定義されていない //変数名をLfnameに変更すると"std::string"から"LPCWSTR"へ変換できないと言われる PlaySound(TEXT(fname), NULL, SND_FILENAME | SND_SYNC); } return 0; } ``` ### 試したこと プロパティの変更からマルチバイト文字に変更:項目が見当たらない TEXT(fname) : Lfnameが定義されていない 変数名をLfnameに : 最初のエラー("std::string"から"LPCWSTR"へ変換できない)が出る 直値でファイルネームを指定 : 正常に音が鳴る リソースファイルにして解決しようともしたのですが、インスタンスハンドルもわからないので疑問点が増えただけでした。 ### 補足情報(FW/ツールのバージョンなど) Visual studio 2017 無料版 .NET Framework
回答: こんにちは。 std::stringはchar型文字列を管理するクラスです。 TEXTマクロ.aspx)は文字列**定数**を使用している文字列形式へ変換するものです。(単にLをつけたりつけなかったり) つまり、TEXTマクロで、std::string型の文字列形式を変換することはできません。 また、`string Lfname = "%02d.wav", random;`でやりたい気持ちは伝わってくるのですが、その意図通りには解釈してくれません。std::string型Lfname変数を定義して"02d.wav"で初期化し、std::string型random変数を定義するだけです。C/C++の文法ではそのようになります。 以下の方法でLfnameに"1.wav"のような文字列が設定されます。 ``` #include : std::stringstream ss; ss << random << ".wav"; std::string Lfname = ss.str(); ``` また、TEXTの使用をやめ、プロジェクトのプロパティ → 構成(C)を「全ての構成」とし、そのまま全般 → 文字セットを「マルチ バイト文字セットを使用する」とするとビルドできるようになると思います。 ``` PlaySound(Lfname.c_str(), NULL, SND_FILENAME | SND_SYNC); ``` ところで、もしかして、LfnameのLは、L"あいうえお"のLのつもりでしょうか? 単に変数名の一部に過ぎませんので、L"あいうえお"のLの役割は果たしません。 ちなみに、上記はchar型(マルチバイト文字)基準で対応する方式です。マルチプラットフォーム対応する時に向いている方法です。 Windowsだけ対応の場合は、ワイド文字(UTF-16)を用いる方が主流です。std::stringではなくstd::wstringを使えばできると思いますが、私は慣れないので具体的な方法はパスします。