摘要
遇到过很三次win10系统下调用sndPlaySound
导致虚拟内存(分页缓冲池)泄露的情况,于是乎便尝试换个方式播放wav文件,使用zplay库进行播放,还是存在泄露。后来参照网上的教程调用waveOutWrite做了个dll库,还是存在泄露!
目前还没有好的代码方案解决这个重复播放声音导致内存泄露的方案,希望有经验的大佬看到给个建议。
模块介绍
PlayAudio.dll 完成将wav文件转为pcm文件,然后调用waveOutWrite进行播放。(模块的职责就是接受wav文件绝对路径,然后播放)
PlaySound_Demo.exe调用PlayAudio.dll 播放声音。(模块的职责就是变着花样调用PlayAudio.dll)
批处理介绍
这里简单说下我对于延迟环境变量setlocal ENABLEDELAYEDEXPANSION
的理解,我们知道编译器将代码生成可执行程序的时候有个“优化”选项,有的时候存在一些变量被“优化掉”,具体表现就是没有重新计算,而是直接用的上一次的值。
为了避免这个优化,需要用到volatile
这个关键字。这个关键字告诉编译器这个变量每次都需要重新计算。批处理中的延迟环境变量和这个的道理大差不差。^ v ^
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo %cd%
set ProgramName=PlaySound_Demo.exe
set FileName=%cd%\%ProgramName%
echo !FileName!
set /a sum=0
set /a ii=0
for /l %%i in (1,1,20) do (
set /a ii+=1
set /a sum+=ii
start /d %cd% PlaySound_Demo.exe
ping -n 10 127.0.0.1
echo !ii!
)
pause
整个工程文件路径
链接: 点此下载