C++ Directshow渲染过滤器仅在发布模式下崩溃

C++ Directshow渲染过滤器仅在发布模式下崩溃,c++,filter,directshow,C++,Filter,Directshow,我已经编写了一个自定义渲染器过滤器,用于将视频帧推送到系统内存,然后再推送到OpenGL。它不在DLL中,我也不注册它,而是像第一段中描述的那样使用它。这在调试模式下可以正常工作,但在发行版中它开始崩溃。我正在执行以下操作来初始化图形: HRESULT hr; CoInitialize(0); CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph); graph-

我已经编写了一个自定义渲染器过滤器,用于将视频帧推送到系统内存,然后再推送到OpenGL。它不在DLL中,我也不注册它,而是像第一段中描述的那样使用它。这在调试模式下可以正常工作,但在发行版中它开始崩溃。我正在执行以下操作来初始化图形:

HRESULT hr;

CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);

graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);

grabber = new textureGrabber(0, &hr);
grabber->AddRef(); // crash here
grabber->setTexture(&texture);
grabber->QueryInterface(IID_IBaseFilter, (void**)&base);

graph->AddFilter(base, L"OpenGL texture video filter");
graph->RenderFile(path.c_str(), 0);
由于访问冲突,此操作在AddRef上崩溃。我已经尝试过自己实现这个类的IUnknown,我得到的最好结果是AddFilter崩溃了,因为IBaseFilter似乎无效。在那之后,我甚至找到了一个简单的方法来做这件事,这似乎对他们有效。我很好奇有什么可能是错误的,因为我正在做同样的事情——甚至尝试了智能指针


编辑:问题出在CBaseFilter DECLARE\u IUNKNOWN宏中,GetOwner->AddRef失败。GetOwner本身似乎可以工作。

GetOwner返回您作为第二个参数传递给CBaseFilter构造函数的任何内容。通常为NULL,除非您出于某种原因聚合对象,否则您可能不需要这样做。

如果发布版本链接到Strmbasd.lib(DirectShow基类库的调试版本),则此时可能会发生崩溃

将项目的发布配置改为链接到strbase.lib,它是库的发布版本。

崩溃与textureGrabber实现有关,通过新的/AddRef行使用调试器进行简单的单步操作会给您一个提示。