在Windows 10上使用Microsoft GS Wavetable Synth的midiOutOpen失败

fhe*_*vol 12 c++ midi multimedia windows-10

我有一个依赖于内置Microsoft GS Wavetable Synth的应用程序.它在Windows XP,Vista,7,8和8.1上完美运行.在Windows 10上第一次调用midiOutOpen时,后续调用会导致错误代码1,意味着"未指定错误".代码很简单:

result = midiOutOpen(&_midiOutHandle, midiOutputDevice, NULL, 0, CALLBACK_NULL);
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法都非常受欢迎.

Han*_*ant 10

我看到了.跟踪机器代码,我看到modMessage()函数失败并返回MMSYSERR_ERROR.究竟为什么我不清楚,它看起来像一个缺少初始化问题.

这个事故的奇怪之处在于没有太多关于它的抱怨,你会期待很多其他程序也会出现问题.或者就此而言,在Win10发货之前对它们进行测试.接下来我尝试的是添加我在测试程序中跳过的任何非平凡音频应用程序中发生的一件事.部分灵感来自在modMessage的符号中看到"ATL",尽管它并不是在任何地方.我将其添加为main()中的第一行:

   CoInitializeEx(NULL, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)

Badaboom,没有更多的错误.如果在UI线程的主线程上调用它,请使用COINIT_APARTMENTTHREADED.CoUninitialize()最后清理.

解释它很困难,使用MIDI时不需​​要初始化COM.有了它,调用midiOutOpen会再加载一个DLL,clbcatq.dll.这是一个COM +支持模块.所以看起来Win10需要初始化COM.