【问题标题】:Media Foundation using C instead of C++使用 C 而不是 C++ 的媒体基础
【发布时间】:2014-06-24 05:16:31
【问题描述】:

我正在学习使用 Microsoft 网站中显示的示例代码中的 Media Foundation API,使用 C 而不是 C++。示例代码如下所示。

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

    UINT32 count = 0;

    IMFAttributes *pConfig = NULL;
    IMFActivate **ppDevices = NULL;

    // Create an attribute store to hold the search criteria.
    HRESULT hr = MFCreateAttributes(&pConfig, 1);

    // Request video capture devices.
    if (SUCCEEDED(hr))
    {
        hr = pConfig->SetGUID(
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
            MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
            );
    }

    // Enumerate the devices,
    if (SUCCEEDED(hr))
    {
        hr = MFEnumDeviceSources(pConfig, &ppDevices, &count);
    }

    // Create a media source for the first device in the list.
    if (SUCCEEDED(hr))
    {
        if (count > 0)
        {
            hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(ppSource));
        }
        else
        {
            hr = MF_E_NOT_FOUND;
        }
    }

    for (DWORD i = 0; i < count; i++)
    {
        ppDevices[i]->Release();
    }
    CoTaskMemFree(ppDevices);
    return hr;
}

当我尝试构建示例代码时,我总是收到以下错误:

错误 C2039:“ActivateObject”:不是“IMFActivate”的成员 错误 C2039:“发布”:不是“IMFActivate”的成员 错误 C2039:“SetGUID”:不是“IMFAttributes”的成员

我探索了 IMFActivate 和 IMFAttributes 的定义(在 mfidl.h 中),我注意到它有一个 C 风格的界面。

我可以知道是否有人可以展示如何使用该界面的示例吗?

【问题讨论】:

  • 您当然可以使用 C 而不是 C++。您的问题可能与 COM 和 Media Foundation 的必要包含有关。
  • 实际的错误不会使标题更好/更相关吗?另外,为什么不创建一个 SSCCE?删除所有与 bug 无关的代码行。
  • 有时这些错误是由于外部“C”或缺少它。
  • 你需要设置正确的define来使用C​​风格的接口,你还需要确保你是在C模式下编译,因为在C++模式下编译可能会出现问题。

标签: c winapi com ms-media-foundation


【解决方案1】:

您应该使用定义为“C 风格”的 COM 接口,使用虚拟方法表指针:

IMFActivate* pMfActivate = ...
IMFMediaSource* pMfMediaSource;
pMfActivate->lpVtbl->ActivateObject(
    pMfActivate, &IID_IMFMediaSource, (IUnknown**) &pMfMediaSource);

C++ 风格在哪里

IMFActivate* pMfActivate = ...
IMFMediaSource* pMfMediaSource;
pMfActivate->ActivateObject(
    __uuidof(IMFMediaSource), (IUnknown**) &pMfMediaSource);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多