Я пытаюсь инициализировать 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.
Кто-нибудь может сказать, с чем это связано? Нужно ли вызывать CoInitialize при использовании DirectSound или я могу обойти COM-вещи?
Вот мои варианты компоновщика:
set CommonLinkerFlags= -incremental:no -nodefaultlib -stack:0x100000,0x100000 ^
kernel32.lib ^
user32.lib ^
gdi32.lib ^
winmm.lib
Невозможно использовать Direct Sound без COM, потому что он основан на COM. Самый первый звонок DirectSoundCreate
создает экземпляр объекта, реализующего IDirectSound
COM интерфейс. Документация упоминает что явная инициализация COM не требуется в некоторых ситуациях. Но это хорошая идея, чтобы вручную выполнить это в любом случае, чтобы быть на безопасной стороне. CoInitialize
является обязательным при работе с COM. Как правило, это должно быть одной из первых вещей, которые нужно сделать при инициализации приложения, перед созданием окон / рендеров. И не забудьте позвонить CoUninitialize
когда вы закончите работать с COM.
Других решений пока нет …