如何在vc++?未定义samplegrabber 视觉社区2015中有一个C++项目。 在cpp文件中,我有 #include "stdafx.h" #include "VideoCaptureFilterSample.h" #include "VideoCaptureFilterSampleDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif

如何在vc++?未定义samplegrabber 视觉社区2015中有一个C++项目。 在cpp文件中,我有 #include "stdafx.h" #include "VideoCaptureFilterSample.h" #include "VideoCaptureFilterSampleDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif,c++,visual-c++,video,directshow,samplegrabber,C++,Visual C++,Video,Directshow,Samplegrabber,在输入项目属性>VC++目录时,我还设置了以下目录:C:\Program Files%28x86%29\Microsoft SDK\Windows\v7.1\Samples\multimedia\directshow\baseclasses 问题是,当我键入代码时: hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pGrabberF)); 未定义CL

在输入项目属性>VC++目录时,我还设置了以下目录:C:\Program Files%28x86%29\Microsoft SDK\Windows\v7.1\Samples\multimedia\directshow\baseclasses

问题是,当我键入代码时:

hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&pGrabberF));
未定义CLSID_采样捕获器


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

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

然后确保链接到amstrmid.lib。您可以将符号从libs目录中删除,以防需要其他符号


我没有完全测试它,因为我手头没有dshow示例文件,但当我调试它时,它已解析为
c1f400a0-3f08-11d3-9f0b-006008039e37
或类似的东西;如果你在谷歌上搜索GUID的第一部分,你现在可以找到更多关于它的信息:有时候,使用魔法GUID,你只需要一个小钩子,然后你就可以轻松地挖掘出其余部分。

CLSID\u SampleGrabber
很久以前就从Windows SDK中删除了,你需要找到声明。该实现最近才从Windows操作系统中删除(Windows Server 2012?)

您可以通过以下方式将其返回到您的项目:

#从Windows SDK qedit.h中删除重新添加的杂注区域
结构说明(uuid(“0579154a-2b53-4994-b0d0-e773148eff85”))
ISampleGrabberCB:IUnknown
...
结构说明(uuid(“c1f400a0-3f08-11d3-9f0b-006008039e37”))
样品采集器;
//[默认]接口是SampleGrabber
...
CComPtr pSgBaseFilter;
ATLsure_成功(pSgBaseFilter.CoCreateInstance(uuuIdof(SampleGrabber));
链接amstrmid.lib是一个很好的提示,但是您几乎不需要单独使用
CLSID\u SampleGrabber
,您还需要
ISampleGrabber
和朋友,而库仍然承载guid(作为副作用),这一点您无法理解

另见:


@Roman R's可能是更好的答案,但我发誓,我第一次就把GUID搞对了。这并不重要,但我的不一样是因为某些原因。你的CLSID是正确的,我只是更新了它,使其完全正确。奇怪的是,我刚刚从4个不同的amstrmid.lib中找到了4个不同的CLSID,包括2个比6.1版windows SDK更新的CLSID。但我的登记册上有你的。我认为armstrmid.lib在这方面是垃圾,我应该删除我的答案,你认为呢?从技术上来说,你的答案是正确的-guid仍然存在于这个.lib中,尽管我猜测它们是无意中留下的,或者有另一个原因导致很难或不希望删除它们。与qedit.dll和qedit.h相对应的“正常”声明被故意删除。所以,使用this.lib是可以的,但正如我所说的,开发人员通常也需要其他声明。
#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)));