COM and DirectSound

COM and DirectSound

本文关键字:DirectSound and COM      更新时间:2023-10-16

我正在尝试通过以下方式初始化直接声音:

// 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)))
    {

问题是我收到此错误(?

onecorecomcombaseobjactobjact.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

没有COM就无法使用Direct Sound,因为它是基于COM的。您DirectSoundCreate进行的第一个调用会创建一个对象实现IDirectSound COM 接口的实例。文档提到在某些情况下不需要显式 COM 初始化。但为了安全起见,无论如何手动执行它是一个好主意。 在处理COM内容时,CoInitialize是强制性的。通常,这应该是在创建窗口/渲染之前在应用程序初始化时要做的第一件事。并且不要忘记在使用完 COM 后致电CoUninitialize