「Visual C++ 2008 Express」の「PlaySound」関数についてのエラー解決方法は?

このQ&Aのポイント
  • 「Visual C++ 2008 Express」の「PlaySound」関数を使った際に発生するエラーについて解決方法を教えてください。
  • 「Windows フォームアプリケーション」で「wav」ファイルを読み込むために、「Visual C++ 2008 Express」の「PlaySound」関数を使用していますが、エラーが発生します。このエラーの解決方法をお教えください。
  • 「PlaySound」関数を使用したサイコロゲームでBGMを再生しようとしていますが、エラーが発生してうまくいきません。エラーの解決方法を教えてください。
回答を見る
  • ベストアンサー

「Visual C++ 2008 Express」の「PlaySoun

「Visual C++ 2008 Express」の「PlaySound」関数について。 サイコロゲームが完成したのでBGMを入れようと思い 「PlaySound」関数を使ったところエラーに沢山阻まれうまくいきません。 --作成した経路&環境&やりたいこと-- 「Windows フォームアプリケーション」→「ソリューションも作成」 DirectXなしで「wav」ファイルを読みこみたい。 動画を添付してますが一応コードを乗せときますね。 --------------------------------------------------------------- #pragma once //ここから追加 #pragma comment(lib,"winmm.lib") #include <stdio.h> #include <windows.h> #include <mmsystem.h> //ここまで追加 namespace WinFAPI_S {  ~~省略~~ (一番下の方まできて・・・) #pragma endregion //ここから追加 int main(){ PlaySound("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC); } }; } ------------------------------------------------------------- これをビルドすると「\Form1.h(74) : error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [16]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)」 というエラーがでてしまう困っております。 このエラーを解決するにはどうしたらよいでしょうか? またソースの書き方などが間違っているとか、アドバイスなどがございましたら言ってください。 それではよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.2
sakana20zb
質問者

お礼

URL2つもありがとうございます。 問題の方は解決しておりませんが自力で解決することにします。

sakana20zb
質問者

補足

御答いただきありがとうございます。 「キャスト」のURLだと沢山のエラーが出てしまいますね。 「文字セットを変更する」のURLを参考にしてビルドすると 「(75) : error C4716: 'WinFAPI_S::Form1::main' : 値を返さなければいけません」 とでるので・・・「return 0;」を新しく追加してみました。 ------------------------------------------------------------------------------- //以前追加した者 int main(){ PlaySound("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC); return 0;//←新しく追加したもの } }; } ----------------------------------------------------------- LNK4022: シンボル 'main' の unique match が見つかりません。 LNK4002: "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) は .\Debug\Win F API _S.obj で定義されています。 っというかんじのリンカエラーが4個でるので、これでいくのは難かしそうな気がします。 ちなみにリンカエラー(LNK4022)をググったのですが自分では到底理解できない内容でした・・・orz 調べながら色々試しておりますが引き続きお願いいたします。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

http://fatalita.sakura.ne.jp/Junk/_T/index.html こういう話ではないですか? LPCWSTR ってことは、const wcharへのポインタということなので、unicode文字列を要求していて、それに対して、"霊夢テーマ2.wav"というマルチバイト文字列を与えてしまっているためではないかと思われます。

sakana20zb
質問者

補足

御答いただきありがとうございます。 そのURLに載ってたことを色々試してたので返事がおくれました。 URLにあった「初心者の方へ」をまずやったのですが、やっぱりリンカエラーがでますね。 「上級者向けの説明」は少し理解できたのですが、所詮少しなので難しいですね・・・ ちょいと色々調べてやりながら考えてみます。 ↓ちなみに空のプロジェクトで正常作動したやつ ------------------------------------------------------------------------------- #pragma comment(lib,"winmm.lib") #include <stdio.h> #include <windows.h> #include <mmsystem.h> int main() { PlaySound("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC); }

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

.NETならば System.Media.SoundPlayerクラスを使ったほうがいいのでは? System::Media::SoundPlayer^ pl = gcnew System::Media::SoundPlayer(); pl->SoundLocation = "wavファイルのパス" pl->Play(); といった具合で出来ませんか?

sakana20zb
質問者

補足

御答いただきありがとうございます。 その方法で色々思考錯誤の上たどりついたのがこれ。 ---------------------------------------------------------------------- //追加 int main(){ //新しく追加 System::Media::SoundPlayer^ pl = gcnew System::Media::SoundPlayer(); pl->SoundLocation = "霊夢テーマ2.wav"; pl->Play(); return 0; } }; } ---------------------------------------------------------------------- 「return 0;」がない状態だと「main' : 値を返さなければいけません」 とエラーがでるため追加してあります。 追加するとリンカエラーが4個でますね。 (LNK4022: シンボル 'main' の unique match が見つかりません)など ん~、後もうちょいな気がしますのでがんばりながら解決したいと思っております。 引き続きお願いいたします。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

単にキャストしたらどうでしょうか? PlaySound((LPCWSTR)("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC);

sakana20zb
質問者

補足

御答ありがとうございます。 んー、その方法ですと沢山のエラーがでてしまいますね(8個ぐらい) あとよく見たらエラー内容に2行目? らしきものがあったので追加しますね(最初のコードの「ヘルプを参照)」の↓にあった) 「指示された型は関連がありません。変換には reinterpret_cast C スタイル キャストまたは関数スタイルのキャストが必要です。」 キャストっという言葉がありますね。ですがこのキャストっというものがよくわかりません (初心者) 色々調べてやってますが引き続きお願いいたします。

関連するQ&A

  • timeBeginPeriod()関数が使えるフリーのCコンパイラ

    現在、WIN2000上での、Borland C++ 5.5.1 for Win32を使って、コマンドラインのプログラムを作成しています。 Windowsが起動してからの時間をミリ秒単位で返す関数timeGetTime()を使いたいのですが、 「mmsystem.hをインクルードしてwinmm.libとリンクする」教えてもらったのですが、これらはどこで入手できるのですか? 教えてくださった方はVC++を使っているのですが、これらはBC++では使えないのでしょうか?それとも、どこかから上記の2つを入手してLIBやIncludeフォルダに入れればいいのですか? やりたいことは至極簡単で、キーをたたいた時間間隔を表示したいだけです。 BC++以外のフリーのコンパイラでもかまいません。 timeBeginPeriod()関数と同機能の別の関数を定義してそれを使うというのでもかまいません。

  • C?DOS? プログラミングでwav,midiを鳴らしたいのですが

    初投稿させていただきます。 現在大学にてC言語をプログラミング中で、明日発表が控えているのですが、wavやmidiを再生する方法がわかりません。 WINDOWSでは #include <mmsystem.h> //何処かイベントなどで sndPlaySound("ファイル名", SND_SYNC); という方法で鳴らせるらしいのですが、鳴りません。 同室にいる詳しい学生に見てもらったところ、コンパイラがウィンドウズ上で立ち上がっているけれども、実際はDOSで動作しているからこのやり方ではできなくてわからない、とのことでした。 この意味も私にはよくわからないのですが。 この環境で、「プログラミング上で、入力があったときに音声ファイルを鳴らす方法・関数?」をどなたかご教授下さい。 環境 ■OS WINDOWS98 ■コンパイラ TC  ターボシーと教官が言っていた。ショートカットはMSDOSのロゴ。 ■上のやり方でコンパイルしたときのエラー  Unable to open include file 'MMSYSTEM.H' Undefined symbol 'SND_ASYNC' in function print_data

  • C++ の LNK2001エラー

    「sample.obj : error LNK2001: 外部シンボル ""void * __cdecl SetupDiGetClassDevsW(struct _GUID *,wchar_t const *,struct HWND__ *,unsigned long)" (?SetupDiGetClassDevsW@@$$FYAPAXPAU_GUID@@PB_WPAUHWND__@@K@Z)" は未解決です。」というエラーメッセージが出ます。  ソース中に extern "C" { #include "hidsdi.h" #include <setupapi.h> } #pragma comment(lib, "setupapi.lib") #pragma comment(lib, "hid.lib")  の記述をしています。  Visual C++ 2005 Express Edition で [プロジェクト] -> [プロパティ] -> [構成プロパティ] -> [リンカ] -> [追加のライブラリ] のところにディレクトリ設定も行っています。  どのようにしたら解決できるのでしょうか。

  • Visual C++,OpenCVでのリンクエラー

    こんにちは。 現在、Microsoft Visual C++ 2010 の環境で、OpenCV(ver2.3.1)を用いて、画像認識のアプリケーションを作ろうと考えています。ただ、Visual C++ 、OpenCV共に扱うのが初めてで、openCVのライブラリーをC++に認識させることができていません。 具体的には、下記の様なエラーが出ます。 「 Sample.obj : error LNK2019: 未解決の外部シンボル _cvReleaseImage が関数 _wmain で参照されました。 (同様に、以下の外部シンボルも参照できていません。_cvDestroyAllWindows、_cvWaitKey、_cvShowImage、_cvSmooth、_cvCreateImage、_cvGetSize、_cvNamedWindow、_cvLoadImage) 」 リンクの設定が上手くできていないと考え、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 全般 > 追加ライブラリディレクトリ に、C:\opencv\build\x64\vc10\lib というように記入し(64bit環境です)、また、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 入力 > 追加依存ファイル に、opencv_core231d.lib;opencv_imgproc231d.lib;opencv_highgui231d.lib;opencv_objdetect231d.lib;opencv_contrib231d.lib;opencv_features2d231d.lib;opencv_flann231d.lib;opencv_gpu231d.lib;opencv_haartraining_engined.lib;opencv_legacy231d.lib;opencv_ts231d.lib;opencv_video231d.lib を追加しております。 実行しているサンプルファイルは下記になります。 -------------------- // Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // 『C:\OpenCV2.3\include』を追加のこと #include "opencv2\\opencv.hpp" #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231.lib") #endif int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //表示ウィンドウの作成 cvNamedWindow("src"); cvNamedWindow("dst"); //処理後画像データの確保 IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //画像の表示 cvShowImage ("src", src_img); cvShowImage ("dst", dst_img); //キー入力待ち cvWaitKey (0); //全てのウィンドウの削除 cvDestroyAllWindows(); //画像データの解放 cvReleaseImage(&src_img); cvReleaseImage(&dst_img); return 0; } --------------- 初心者な質問で大変恐縮ながら、どこを修正すればよいかお分かりでしたら、お教え頂けませんでしょうか?何卒宜しくお願いします。

  • Visual C++でのfelicaプログラム

    SONYのサイトで、SDK for NFC Starter Kit が公開されているので、ためしにFelicaカードの読み取りプログラムを作ってみようと思っています。 サンプルとして、C++が載っていましたので、Visual C++ 2010で動かそうとしましたが、 「error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _wmain で参照されました」と表示されます。 プロジェクトのプロパティで、C/C++ → 全般 → 追加のインクルードディレクトリ もSDKのincludeのディレクトリを指定しましたし、 同じく リンカー → 全般 → 追加のライブラリディレクトリ もSDKのlibのディレクトリを指定しました。 エラーを解決する方法を教えてください。 よろしくお願いします。 なお、プログラムは簡単な下記のものでもエラーがでます。 #include "stdafx.h" #include <cstdio> #include <cstdlib> #include "felica.h" int _tmain(int argc, _TCHAR* argv[]) { initialize_library(); return 0; }

  • 音楽再生についてのVC++のプログラムの質問

    今あるソフトを作っているんですが、マルチメディアを使う場合に、mmsystem.hと いうヘッダファイルとwinmm.libというライブラリを使っているんですが、winmm.libとライブラリがどうゆうものかわからないのです。本に書いてあり、それをそのまま書いて実行させているのですが、これはフリーのライブラリなのでしょうか?詳しい方教えてください。

  • DirectXのdmusici.libについて

    宜しくお願い致します。 ここ2ヶ月ほど、XPSP2及びVC++6.0の環境下で、win32APIを使って簡単なミニゲームを細々と作成してきましたが、たまたまDirectXについて記載してある本を入手した関係で、環境をVC2008Express+DirectXに変更しました。 それ以前にプログラミング経験は無い為、レベルは初心です。 質問: 1)dmusici.libは存在するのか? 2)存在するとしたら入手先はどこか? 3)存在しない場合、エラーを無くすにはどうしたら良いか? とりあえず上記設定で、DirectXのフォルダに入っているサンプルプログラムを動かそうと思ったのですが、 LINK : fatal error LNK1104: ファイル 'dmusici.lib' を開くことができません。 と言われてしまいました。 サンプルプログラムは、 #include <Windows.h> #include <mmsystem.h> #include <d3dx9.h> #pragma warning( disable : 4996 ) #include <strsafe.h> #pragma warning( default : 4996 ) … と記載しています。 色々調べたところ、dmusici.h というインクルードファイルは存在し、dxguid.lib をリンクして使用するらしいのですが、dmusici.lib については、サイトが全て英語だったこともあり、理解出来ませんでした。 以上宜しくお願い致します。

  • 初歩的なのですが・・・

    do whileを用いた文で抜け出したくてコマンドを入力しても抜けれず  抜けてはいけないときに抜けてしまいます・・ プログラムは・・ #include<iostream> #include<Windows.h> #include<MMSystem.h> #pragma comment(lib, "winmm.lib") using namespace std; int main (){ sndPlaySound("start",SND_SYNC); double i, j, ido, keido; do { cout <<"i="; cin >>i; cout <<"j="; cin >>j; if (i==138.8607033 && j==35.07979167) sndPlaySound("port",SND_SYNC); else if (i==138.797575 && j==35.12242833) sndPlaySound("hara",SND_SYNC); else if (i==138.795445 && j==35.15679333) sndPlaySound("tokai",SND_SYNC); else if (i==138.8604367 && j==35.09611333) sndPlaySound("numadus",SND_SYNC); else if (i==138.855455 && j==35.080332167) sndPlaySound("senbon",SND_SYNC); else if (i==138.88019 && j==35.06325) sndPlaySound("kinen",SND_SYNC); else if (i==138.8958317 && j==35.02811333) sndPlaySound("awasima",SND_SYNC); else if (i==138.8679883 && j==35.140775) sndPlaySound("inter",SND_SYNC); else if (i==138.9153667 && j==35.1227) sndPlaySound("misimas",SND_SYNC); else if (i==138.9214167 && j==35.11716167) sndPlaySound("misimat",SND_SYNC); else if (i==138.9149367 && j==35.11563667) sndPlaySound("rakujuen",SND_SYNC); else cout<<"まだ途中です\n"; } while (i==1 && j==1); if (i==1 && j==1){ sndPlaySound("goal",SND_SYNC); } return 0; です。i,jにそれぞれ1を入れると抜けれるようにしたいのですが・・ どなたかわかりますでしょうか?

  • C++でConvertSidToStringSid関数を使うために、sddl.hを使用したい

    お世話になります。 現在C++ 6.0でソフトを作成しています。 その中でConvertSidToStringSid関数を使うために、sddl.hを使用したいのですが、下記のようなエラーが出ます。 -----------インクルード------------------ #include <stdlib.h> #pragma comment(lib,"netapi32.lib") //////////ここで定義しているつもりです。 #define _WIN32_WINNT 0x0500 #include <windows.h> #include <sddl.h> //////////ここで定義しているつもりです。 #include <tchar.h> #include <lmaccess.h> #include <lmapibuf.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ----------デバックエラー J:\Del.cpp(17) : fatal error C1083: インクルード ファイルがオープンできません。'sddl.h': No such file or directory どのようにすればConvertSidToStringSid関数を使うために、sddl.hを使用できますでしょうか? 何卒よろしくお願いします。

  • timeGetTimeについて

    宜しくお願いします。 http://www.tsg.ne.jp/sept/prg/memo/timegettime.asp 上記のサイトを参照してtimeGetTimeを利用して実行時間の計測をしています。 このサイトにはmmsystem.hをインクルード,winmm.libとリンクしデータ型はDWORD型とあります。 しかし,そうしなくともwindows.hをインクルードしdouble型でtimeGettime();を読み込んでも値を読み込んでくれます。そしておそらく正確な数値のようなのですが,これでも大丈夫なのでしょうか。また,なぜこれでもできるのでしょうか。 御指南ください。使っているコンパイラはBCCでC言語で組んでいます。

専門家に質問してみよう