IMFActivate :: ActivateObject возвращает код ошибки & quot; CoInitialize не был вызван. & Quot;

Я пишу простое мультимедийное приложение в Visual Studio 2013, и мне нужно перечислить устройства камеры, подключенные к моему компьютеру, и создать объект источника мультимедиа для ссылки на одно из них. Я использую Media Foundation SDK и попытался запустить руководство здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/dd940326(v=vs.85).aspx :

#include <Mfapi.h>
#include <mfidl.h>
#include <mfobjects.h>
#include <iostream>

#pragma comment(lib, "Mfplat")
#pragma comment(lib, "Mf")

template <class T> void SafeRelease(T **ppT) {
if (*ppT) {
(*ppT)->Release();
*ppT = NULL;
}
}

HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource) {
*ppSource = NULL;

IMFMediaSource *pSource = NULL;
IMFAttributes *pAttributes = NULL;
IMFActivate **ppDevices = NULL;

// Create an attribute store to specify the enumeration parameters.
HRESULT hr = MFCreateAttributes(&pAttributes, 1);
if (FAILED(hr))
{
goto done;
}

// Source type: video capture devices
hr = pAttributes->SetGUID(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
);
if (FAILED(hr))
{
goto done;
}

// Enumerate devices.
UINT32 count;
hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
if (FAILED(hr))
{
goto done;
}

if (count == 0)
{
hr = E_FAIL;
goto done;
}

// Create the media source object.
hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
if (FAILED(hr))
{
std::cout << "Failed to create device object" << hr <<std::endl;
goto done;
}

*ppSource = pSource;
(*ppSource)->AddRef();

DWORD chs;
(*ppSource)->GetCharacteristics(&chs);
std::cout << chs << std::endl;

done:
SafeRelease(&pAttributes);

for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
SafeRelease(&pSource);
return hr;
}

int main(int argc, char* argv[]) {
IMFMediaSource* ppSource;
CreateVideoDeviceSource(&ppSource);
std::cout << "END" << std::endl;

return 0;
}

Проблема в том, что эта часть кода:

 // Create the media source object.
hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
if (FAILED(hr))
{
goto done;
}

не удается создать объект источника мультимедиа (возвращается HRESULT 0x800401F0 (CO_E_NOTINITIALIZED) — «CoInitialize не был вызван.
«). Что означает код ошибки и что может быть причиной сбоя? Я использую WIN8.1.

2

Решение

Com библиотеки должны быть инициализированы для каждого потока, через любой из

  • CoInitialize
  • CoInitializeEx
  • OleInitialize

в зависимости от того, какие услуги будут использоваться в этой теме.

Сделайте это в начале вашей программы для всех потоков, использующих COM, и не забудьте вызвать соответствующую функцию Uninitialize.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector