读书人

怎么捕获API函数错误

发布时间: 2012-03-11 18:15:39 作者: rapoo

如何捕获API函数异常
我最近练习使用mciSendCommand()在vista下去进行midi的播放,但是在长时间运行后,程序宕掉了,追踪发现宕在mciSendCommand()上。于是想找导致异常的原因,但是不知道怎么捕获它。
我尝试使用 __try...__exception(EXCEPTION_EXECUTE_HANDLER),但是没能捕获到,各位大侠有什么高见吗?怎么才能捕获到它?谢谢。
另外,我还碰到一个错误:FM synthersize test error,由于疏忽,程序没能记下当时的错误号,我也不知道怎么从这个描述反追回去,有办法吗?

[解决办法]
音量控制
mixerSetControlDetails

auxoutsetvolume 是控制 CD 音量的

waveOutSetVolume 是控制波形的

midiOutSetVolume 是控制 FM 或者是 synthesizer


[解决办法]
The program has failed to play the midi file, with error information: "FM synthesizer test error ",
[解决办法]
__try...__excepti基于SEH机制。
SEH只能捕获__try...__exception这段代码执行时所在线程中出现的异常,
SEH并不能捕获整个进程中的异常,除非你在进程的每个线程中都使用SEH。

对于windows而言,并不等保证声音的播放是在声音播放函数的调用者所在的
线程中进行的,即使使用了同步方式,也是如此。在用VC集成环境里调试时在output区域的Debug窗口会出现类似thread xxx terminated的信息,即可验证这一点。
所以你就算用__try..except把声音播放函数包围起来也可能是没有用的。
mciSendCommand这个函数不是很清楚,搂主可按照上面的方式验证一下。

建议使用SetUnhandledExceptionFilter这个函数,找出产生异常的崩溃地址。
再利用编译时产生的.map文件等信息,找出崩溃所在的模块。

当然,Microsoft的东西相对而言还是比较稳定的。建议楼主仔细检查一下
自己所写代码有无问题,可从检查穿越给API的参数入手.这么讲希望搂主
不要介意。


读书人网 >C++

热点推荐