【发布时间】: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