PlaySound 播放资源时的非法操作

用 Windows API PlaySound 企图播放 资源文件里的 Wave 文件的时候,发现第二遍播放没有声音,于是写了段测试代码:

for( int i=0; i<10; i++ )
     PlaySound( MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE  | SND_SYNC | SND_NODEFAULT ); 
 然后就很意外的发现执行第二遍的时候,PlaySound 会导致一个非法操作,百思不得其解。猜想 PlaySound 对资源文件的内存管理有 BUG。
(NULL 换成 GetModuleHandle(NULL) 还是一样的。)

只能曲线救国了,从网络上找了个 PlayResource 的函数代码,是调用 sndPlaySound 的,结果同样会导致非法操作,貌似 资源的句柄被 sndPlaySound 内部释放了,狂晕。

最终解决方案,将资源加载到内存再播放:

BOOL PlayResource( LPCTSTR resID, HMODULE rhandle=NULL )
{
    LPTSTR lpres;
    HANDLE hres;
    HRSRC hresinfo;
 hresinfo= FindResource( rhandle, resID,_T("Wave") );
    if(hresinfo == NULL)      return FALSE;
 DWORD size=SizeofResource( rhandle, hresinfo );
    hres = LoadResource( rhandle,hresinfo);
    if (hres == NULL)      return FALSE;
    lpres=(LPTSTR)LockResource(hres);
    if(lpres==NULL)     return FALSE;
 HLOCAL hl=::LocalAlloc( GMEM_FIXED, size );
 LPVOID p=LocalLock( hl );
 CopyMemory( p, lpres, size );
   BOOL ret=sndPlaySound( (LPCTSTR)p, SND_MEMORY | SND_SYNC);
   ::LocalUnlock( hl );
   ::LocalFree( hl );
    return ret;
}

如果谁了解 PlaySound 播放资源中 Wave 的细节请告知

PS: 貌似只有我的系统有这个问题,看来是特定系统才有的 BUG。我的是 XP 系统,打了所有已知补丁,使用的编译器是 VS 2005 中文版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值