简单来说:替代系统自带的文件时,做好是做一个备份,而不是直接覆盖。最大限度的能让你“回到从前”,假如有机会的话(没机会的意思就是要重装系统了)
发生了什么:用一个网上搜索的新版本winmm.dll代替了系统原有的winmm.dll(暂时获得了权限),vba播放 *.wav文件有声音了,但是打开浏览器、打开微信、等等均失败,都是找不到 winmm.dll 中的 xxx接口。
如果解决:
用系统自带功能修复,前提是电脑能连上internet,尽管打不开浏览器:
在获得权限后(即使使用以管理员身份运行,也可能需要权限,决定于当时系统的设定),运行cmd, 在使用 sfc /scannow, 等待完成就好。有兴趣可以根据提示继续看日志。
下面是详细的信息
背景:
1. 系统及软件信息
win10, 20H2, 操作系统 19042.630 (下面有解释为何要记录这么详细)
win10 api 函数 winmm.dll, 系统自带版本-10.0.19041.546;尝试版本-10.0.19608.1000
excel版本 16.0 (office 2016)
2. 记录事件
目标是练习下在excel vba中使用 win api 的 sndPlaySoundA,位于 winmm.dll中。
代码见下面。
遇到的异常:在代码没有出错提示、wav文件可以用win10自带软件播放、系统喇叭音量正常情况下,听不到用vba 代码播放的 wav 文件的声音。
解决过程:
1. 先在网上找了一个高版本的 winmm.dll, 具体是在金山毒霸的网址上下载了一个高版本的winmm.dll, 并且覆盖了系统的winmm.dll (自己挖的坑),页面https://www.ijinshan.com/filerepair/winmm.dll.shtml
2. 在运行vba代码,正常听到了 *.wav文件播放的声音。但是,
3. 马上发现上网打开浏览器出错,微信也打不开。预计还有其它使用winmm.dll的应用程序打不开。
4. 以管理员身份打开power shell, 运行 sfc /scannow (之前有空格), 系统自动修复后,正常打开浏览器、微信。 winmm.dll恢复了之前的版本(根据文件的时间、大小推测),神奇的是vba 播放 *.wav文件正常了。
推测:
不去“复现”问题的修复过程了:推测在之前vba播放声音文件不正常时,用管理员身份运行 sfc /scannow 也能修复
vba播放 *.wav文件的代码
Public Declare PtrSafe Function PlayWavSound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal LpszSoundName As String, ByVal uFlags As Long) As Long
Public Sub myPlayWav() 'does NOT work so far, no error msg, no sound play
'api practise
Dim fname As String 'wav file name
fname = ThisWorkbook.Path & "\speaker_test_sound.wav"
PlayWavSound fname, &H0
End Sub