COM 和 DirectSound

Posted

技术标签:

【中文标题】COM 和 DirectSound【英文标题】:COM and DirectSound 【发布时间】:2018-01-20 08:48:47 【问题描述】:

我正在尝试通过以下方式初始化 Direct Sound:

// Somewhere in my header...
#define DIRECT_SOUND_CREATE(name) HRESULT WINAPI name(LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter)
typedef DIRECT_SOUND_CREATE(direct_sound_create);

// Initialization code...
HMODULE DSoundLib = LoadLibraryA("dsound.dll");
if(DSoundLib)

    direct_sound_create *DirectSoundCreate = (direct_sound_create*)
        GetProcAddress(DSoundLib, "DirectSoundCreate");

    LPDIRECTSOUND DirectSound;
    if(DirectSoundCreate && SUCCEEDED(DirectSoundCreate(0, &DirectSound,0)))
    

问题是我收到了这个错误(?)

onecore\com\combase\objact\objact.cxx(812)\combase.dll!75521B90: (caller: 7552093B) ReturnHr(1) tid(2444) 800401F0 CoInitialize has not been called.

谁能告诉这与什么有关?使用 DirectSound 时需要调用 CoInitialize 还是可以绕过 COM 的东西?

这是我的链接器选项:

set CommonLinkerFlags= -incremental:no -nodefaultlib -stack:0x100000,0x100000 ^
kernel32.lib ^
user32.lib ^
gdi32.lib ^
winmm.lib

【问题讨论】:

CoInitialize 在处理 COM 内容时是必需的。使用 COM 完成后,别忘了致电 CoUninitialize aha... 有没有办法在没有 COM 的情况下使用 Direct Sound?在手工英雄(youtube.com/watch?v=qGC3xiliJW8)中,我没有看到任何看起来很奇怪的 COM 初始化代码... 没有 COM 就无法使用 Direct Sound,因为它是基于 COM 的。第一次调用DirectSoundCreate,创建了一个实现IDirectSound COM 接口的对象实例。文档提到that explicit COM initialization is not required in some situations。但无论如何,为了安全起见,手动执行它是个好主意。 感谢您解决问题!所以 CoInitialize 似乎是要走的路。写下来作为答案,我会接受:3 请注意,您可能不应该在新项目中使用DirectSound...音频中间件引擎和媒体播放器通常使用 WASAPI,而游戏应该使用 XAudio2。 【参考方案1】:

没有 COM 就无法使用 Direct Sound,因为它是基于 COM 的。第一次调用DirectSoundCreate,创建了一个实现IDirectSound COM 接口的对象实例。文档提到that explicit COM initialization is not required in some situations。但无论如何,为了安全起见,手动执行它是个好主意。 CoInitialize 在处理 COM 内容时是必需的。通常,这应该是在创建窗口/渲染之前在应用程序初始化时首先要做的事情。使用 COM 完成后不要忘记致电 CoUninitialize

【讨论】:

还有一个问题;如果我有 CRT 的自定义实现(我实现了自己的 WinMainCRTStartup),我应该在调用 WinMain 之前调用 CoInitialize 吗? @MattMatt2000 可能之后,如果您决定切换到常规 CRT,它仍然可以正常工作。 请注意,对于一般的 DirectX 编程,您应该在 Win32 桌面应用程序中使用 CoInitializeEx(nullptr, COINITBASE_MULTITHREADED)。请注意,对于 UWP 和 Xbox One 应用程序,当您初始化 Windows 运行时,COM 也会被初始化;并且当使用 C++/CX (/ZW) 时,Windows 运行时已经被 CRT 初始化。

以上是关于COM 和 DirectSound的主要内容,如果未能解决你的问题,请参考以下文章

com1和com2端口链接异常

如何为顶点(example.com)和子域(www.example.com)配置相同的来源 - aws Route53 和 CloudFront

http://www.website.com 和 http://website.com 有啥区别?

example.com,www.example.com和example.com/之间有什么区别?

net和com有啥区别

tm域名和com域名有啥区别, 为啥价格那么贵?