COM 和 DirectSound

COM and DirectSound

我正在尝试通过以下方式初始化 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.

谁能告诉我这个 is/is 与什么有关?使用 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 接口的对象实例。文档提到 that explicit COM initialization is not required in some situations。但为了安全起见,无论如何手动执行它是个好主意。 CoInitialize 在处理 COM 内容时是强制性的。通常这应该是应用程序初始化时要做的第一件事,在创建 windows / 渲染之前。当您使用 COM 完成工作时,不要忘记调用 CoUninitialize