はじめまして。
Windows Forms Application (.NET) でアニメーションを作成してます。その中でドアが開閉した際、開閉音を付けたいのですが、それが出来なくて困ってます。
visual .net C++ 2003 のフレームワークには、音を再生するクラスはなく、windows のクラスを使用することで(PlaySound)出来る事、そして実際 Console Application (.NET) では再生できました。(.cpp file のみ作成、WinMM.Lib は Linker->Input->Additional Dependencies にて添付)
しかし、Windows Forms Application (.NET)上だと、どこに #include <windows.h> と #using <mscorlib.dll> を宣言すれば良いのかが分かりません。(.cpp file なのか .h file なのか)
おそらく、そのせいで、
Form1.h(21): error C2065: 'SND_FILENAME' : undeclared identifier
Form1.h(21): error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
のエラーが発生するのだと思っているのですが。
ちなみに今は、Form1.h の一番上に
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
#using <mscorlib.dll>
using namespace mySomething;
の順に宣言してます。
何かご存知でしたら、よろしくお願いします。
普通に
>ちなみに今は、Form1.h の一番上に
で
>#include "Form1.h"
はおかしいのでは?
Form1.hでForm1.hを#include?
失礼しました。
正しくは、Form1.cpp の一番上に
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
#using <mscorlib.dll>
using namespace mySomething; を、
Form1.h には何も宣言していません。(初期設定のまま、使用してます。)
デフォルトのソースに追加したのは
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
#using <mscorlib.dll>
using namespace mySomething;
すべてでしょうか?
もしかしたら、/clrオプションがpureのままでビルドしているとか?
http://msdn2.microsoft.com/ja-jp/library/k8d11d4s(VS.80).aspx
ただし、VS2003を持っているわけではないので間違っているかも。
ご返事、ありがとうございます。
->デフォルトのソースに追加したのは
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
#using <mscorlib.dll>
using namespace mySomething;
->すべてでしょうか?
はい、これらのみです。
−>もしかしたら、/clrオプションがpureのままでビルドしているとか?
これについては、知らなかったので、設定を見てみると、
/clr (Common Language Runtime Compilation) は、visual.net 2003 には無い見たいです。私のソフトは英語版なので、
http://msdn2.microsoft.com/en-us/library/ms235211(VS.80).aspx
を参考に確認したのですが。
>はい、これらのみです。
いや、デフォルトのソースはそのままびるどできる状態なので、
#include <windows.h>
だけを入れればいいと思うのですけどね。
Form1.cpp の一番上に宣言すべきですよね?
ご指摘の通り、 Form1.cpp の一番上に
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
using namespace mySomething; と、宣言した場合、(即ち、デフォルト設定に #include <windows.h> のみを追加したのみ。)同じエラーが発生し、コンパイルを完了することができません。
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
error C2065: 'SND_FILENAME' : undeclared identifier
error C2065: 'SND_SYNC' : undeclared identifier
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
エラーコードはPlaySound 及びそのパラメーターを認識できないと言っているので、Form.h file 上に何か宣言しなくてはいけないのでしょうか?
例えば
#pragma once
//ここに何か PlaySound に関する #include file 又は #using file
namespace myProject
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
//もしくはここに何か PlaySound に関する using namespace
が、必要なのでしょうか?
ご迷惑お掛けして、申し訳御座いません。
>PlaySound
は実際どのソースで使っているのでしょうか?
Form1.cppではない?
Form1.hなら
#include "Form1.h"
の上にかくか、Form1.hの#pragma once の下 #include <windows.h>を記述すれば
いいです。
(というか、インクルードの仕方とかはC言語の基礎なんだけど。)
PlaySound は Form1.h の中で
private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
PlaySound("mySound1.wav", Handle, SND_FILENAME |SND_SYNC);
}
のような感じで、使ってます。
ご指摘のように、 #include <windows.h> を Form1.hの#pragma once の下に宣言したところ、違うエラーが発生しました。
error C2039: 'GetObjectA' : is not a member of 'System::Resources::ResourceManager' (2 lines)
error C2039: 'GetObjectA' : is not a member of 'System::Resources::ResourceManager'
stdafx.cpp(0) : see declaration of 'System::Resources::ResourceManager' (18 lines)
にプラス前回のエラー
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
error C2065: 'SND_FILENAME' : undeclared identifier
error C2065: 'SND_SYNC' : undeclared identifier
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
依然、どこかのサイトで、このエラーは .NET と WINDOWS のシステムが内部で衝突をするので起こると、見たような気がするのですが、そうなのでしょうか?
C++ から始めたので。Cも勉強すべきなんですね。
VS2005 +最新のPlatform SDKでは
>NET と WINDOWS のシステムが内部で衝突をするので起こる
ことがないようにできているのですが、
それ以前はできていないのですかね。
PlaySoundしか使わないのであれば、
C#やVB.NETのようにDllImportを使うとか。
参考:http://dobon.net/vb/dotnet/programing/playsystemsound.html#playsound
# .NET Framework2.0ならSystem.Media.SystemSoundsというクラスがあるらしいが。
一応
http://support.microsoft.com/kb/888267/ja
ってのがありました。
#include <mmsystem.h>(リンクにwinmm.lib必要)を追加して
sndPlaySoundでも良さそうな気がします・・・・・・。
.netは使ってない(VC++6.0)なのでこんな回答ですけれど
参考にしてみてください。
http://www.kumei.ne.jp/c_lang/sdk4/sdk_342.htm
Blueさん、 みけにゃんさん、 お陰で解決することが出来ました。有難う御座いました。
正解は、
WinMM.Lib を Linker->Input->Additional Dependencies にて添付
Form1.cpp デフォルトのまま。
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
Form1.h
#pragma once
#include <windows.h>
#include <Mmsystem.h>
#ifdef GetObject
#pragma message("Undefine the GetObject function for your managed code.")
#pragma push_macro("GetObject")
#undef GetObject
#endif
namespace myProgect
でした。
プログラムの中で.NETはのフレームワークのライブラリーのファンクション の一つ、GetObjectを使い、イメージを取り出しているのですが、PlaySound も同じくWINDOWSのライブラリーのGetObjectを使いWAVファイルを取り出しているようで、両方とも同じ名前のファンクションということで、システムが認識できなかったみたいです。this見たいな働きをするのが、#ifdef〜〜〜#endifのようです。
貴重なお時間割いて頂き、本当に有難う御座いました。