在资源文件中加入声音资源
作者:浙江大学
本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。
1,首先用文本编辑器(如记事本)打开资源文件(.rc文件)
在最后加入自己的声音资源,如下
IDW WAVE "c:\\kav\\sound\\virus.wav"
保存资源文件。
2,在应用程序中要播放声音的地方启动另一线程,用来播放声音
AfxBeginThread((AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);
3,添加线程回调函数
这里介绍加载资源的方法。首先用函数AfxGetInstanceHandle()获得实例的句柄,其次用函数FindResource找到自己的声音资源。
HRSRC FindResource(
HMODULE hModule, // module handle
LPCTSTR lpName, // resource name
LPCTSTR lpType // resource type
)
找到声音资源后,要用LoadResource加入该资源
HGLOBAL LoadResource(
HMODULE hModule, // module handle
HRSRC hResInfo // resource handle
);
最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:
LPVOID pv=LockResource()
注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。
UINT CPlaySoundView::sound(LPVOID pParam)
{
HINSTANCE h=AfxGetInstanceHandle();
HRSRC hr=FindResource(h,"IDW","WAVE");
HGLOBAL hg=LoadResource(h,hr);
LPSTR lp=(LPSTR)LockResource(hg);
sndPlaySound(lp,SND_MEMORY|SND_SYNC);
FreeResource(hg);
return 0;
}
--------------------next---------------------
定义成静态 static UINT sound(LPVOID pParam);
可以解决上面的问题。我试过,可以边发声,边干别的 ( e7come 发表于 2006-4-6 16:02:00)
我在MDI程序中使用此法加入声音时,有一句总通不过编译,就是AfxBeginThread((AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);这一句.
错误提示:
error C2440: 'type cast' : cannot convert from '' to 'unsigned int (__cdecl *)(void *)'
请问高手,是什么原因啊?急救. ( lcpmyf 发表于 2004-12-18 23:16:00)
将winmm.lib加到输入库列表中 ( yxf7551 发表于 2003-6-5 16:38:00)
我是一名新手,我在编译时报错,具体如下:
MainFrm.obj : error LNK2001: unresolved external symbol __imp__sndPlaySoundA@8
Debug/Test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe
请问如何解决?
( Arry 发表于 2003-6-1 9:46:00)
不错,我以前都是把WAV放在文件里,现在放在资源里更加方便。 ( liutang 发表于 2003-1-29 19:01:00)
没必要使用线程,播放时使用异步方式播放即可:
sndPlaySound(lp,SND_MEMORY|SND_ASYNC); ( ss 发表于 2003-1-27 22:03:00)
.......................................................
--------------------next---------------------