IMFActivate :: ActivateObject返回错误代码"未调用CoInitialize。"

时间:2015-05-28 22:39:59

标签: c++ ms-media-foundation

我在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) - &#34;尚未调用CoInitialize。 &#34)。错误代码的含义是什么?导致失败的问题是什么?我使用WIN8.1。

1 个答案:

答案 0 :(得分:2)

需要通过

中的任何一个为每个线程初始化Com库
  • CoInitialize的
  • 的CoInitializeEx
  • OleInitialize

取决于此线程中要使用的服务。

在程序开始时对所有使用COM的线程执行此操作,并且不要忘记调用相应的Uninitialize函数