Directshow渲染过滤器只在发布模式下崩溃
Directshow render filter crashes only in release mode
我已经编写了一个自定义渲染器过滤器,将视频帧推送到系统内存,然后再推送到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_IUNKNOWN宏中,GetOwner()->AddRef失败。GetOwner本身似乎可以工作
GetOwner返回您传递给CBaseFilter构造函数的第二个参数。通常为NULL,除非您出于某种原因聚合对象(如果您是,您可能不需要)。
如果您的发布版本链接到Strmbasd.lib
,这是DirectShow基类库的调试版本,那么可能会发生崩溃。
更改项目的发布配置以链接到Strmbase.lib
,这是库的发布版本。
相关文章:
- LoadLibrary:在发布模式下崩溃
- 在发布模式下崩溃,但如果可调试为 true - 不是..什么是可能的问题
- boost :: container :: flat_multimap在OSX/Appleclang上以发行模式崩溃
- MSVC 编译器在调试模式下构建 Qt 5.10 时崩溃
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- 在发行模式下开放的软崩溃(调试工作正常)
- MFC 结束对话框崩溃时模式对话框没有焦点
- GCC 在调试模式下崩溃,在发布模式下运行良好
- 在发布模式下崩溃,在调试模式下遇到错误
- C++: __try..__除了;在发布模式下隐藏崩溃
- 通过在 C++ 中使用发布模式二进制文件获取崩溃原因
- cd库:在推送自定义类型的派生类型时(仅在发布模式下),michael_deque会导致崩溃
- wglCreateContextAttribsARB在x64平台下的调试模式下崩溃
- 当结构具有默认构造函数时,为什么我的C++程序在发布模式下崩溃
- boost::any_range<gsl::string_span<>> 在发布模式下崩溃
- 释放模式下的boost线程崩溃
- OCCI应用程序在Visual Studio 2005的调试模式下运行时会崩溃
- c++全系统崩溃,仅发布模式
- Directshow渲染过滤器只在发布模式下崩溃
- Visual Studio 2008-vftable指针不正确?调试模式崩溃,发布即可