COM和DirectSound

时间:2018-01-20 08:48:48

标签: c++ 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.

有谁可以说出这是什么/与之相关?我在使用DirectSound时是否需要调用CoInitialize,还是可以绕过COM的东西?

以下是我的链接器选项:

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

1 个答案:

答案 0 :(得分:1)

没有COM就无法使用Direct Sound,因为它是基于COM的。第一次调用DirectSoundCreate,创建一个实现IDirectSound COM接口的对象实例。文档提到了that explicit COM initialization is not required in some situations。但是最好手动执行它以保证安全。在处理COM内容时,CoInitialize是必需的。通常,这应该是在创建窗口/渲染之前在应用程序初始化时要做的第一件事。当你使用COM时,别忘了打电话给CoUninitialize