2

在视觉社区 2015 中,我有一个 c++ 项目。在cpp文件顶部我有

#include "stdafx.h"
#include "VideoCaptureFilterSample.h"
#include "VideoCaptureFilterSampleDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

我在进入项目属性> VC++ 目录时还设置了我添加的这个目录包括:C:\Program Files %28x86%29\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses

问题是当我输入我的代码时:

hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&pGrabberF));

未定义 CLSID_SampleGrabber。

到目前为止我尝试了什么?下载了 directx sdk 9 和 6 以及 Microsoft sdk 7.1 并在 google 中搜索 qedit.h 但我没有找到该文件。无法弄清楚如何定义 CLSID_SampleGrabber

4

2 回答 2

3

CLSID_SampleGrabber很久以前从 Windows SDK 中删除,您需要与版本 6.1 一样旧的 Windows SDK才能找到声明。该实现最近才从 Windows 操作系统中删除(Windows Server 2012?)。

您可以按照以下示例将其恢复到您的项目中:

#pragma region Re-Adding Removed from Windows SDK qedit.h

struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown

...

struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
SampleGrabber;
    // [ default ] interface ISampleGrabber

...

CComPtr<IBaseFilter> pSgBaseFilter;
ATLENSURE_SUCCEEDED(pSgBaseFilter.CoCreateInstance(__uuidof(SampleGrabber)));

链接 amstrmid.lib 是一个很好的提示,但您几乎从不需要CLSID_SampleGrabber一个人,您也需要ISampleGrabber和朋友,并且仍然托管(作为副作用)GUID 的库不会让您明白这一点。

也可以看看:

于 2016-04-13T04:58:37.957 回答
1

声明如下:extern "C" { extern GUID CLSID_SampleGrabber; }

然后一定要链接到 amstrmid.lib。您可以从 libs 目录中 grep 符号,以防您需要其他符号。

由于手边没有 dshow 示例文件,因此我没有对此进行完全测试,但是当我调试它时,它已解决c1f400a0-3f08-11d3-9f0b-006008039e37或类似的问题;如果你用谷歌搜索该 GUID 的第一部分,你现在可以找到更多关于它的信息:有时使用魔法向导,你只需要一个小钩子,然后你就可以轻松挖掘其余部分。

于 2016-04-13T01:26:11.360 回答