IMFActivate::ActivateObject 返回错误代码“CoInitialize 尚未被调用。”

Cal*_* Hu 3 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;
}
Run Code Online (Sandbox Code Playgroud)

问题是这部分代码:

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

创建媒体源对象失败(返回的HRESULT为0x800401F0(CO_E_NOTINITIALIZED)--“CoInitialize尚未被调用。”)。错误代码的含义是什么?导致失败的问题可能是什么?我用的是WIN8.1。

pet*_*hen 5

需要通过以下任一方式为每个线程初始化 Com 库:

  • 共同初始化
  • 协初始化Ex
  • 初始化Ole

取决于该线程中要使用哪些服务。

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