用C编写DirectShow程序遇hr重定义错误,寻求解决方案
解决DirectShow C代码中
hr重定义错误 问题的核心是C语言和C++的变量声明规则差异:
- C语言(尤其是C89标准)要求变量必须在代码块的开头声明,且同一作用域内不能重复声明同名变量;
- 你参考的微软教程是C代码,C允许在代码流中随时声明变量,但C不支持这一特性,所以直接照搬会触发错误。
你的代码里已经在函数开头声明并初始化了HRESULT hr,后面又重复写HRESULT hr=CoCreateInstance(...),属于同一作用域内重复声明同名变量,这是C语言不允许的。
修复方案
只需要在函数开头一次性声明HRESULT hr,后续直接给hr赋值即可,不需要重复写HRESULT类型:
#include <dshow.h> #include <stdio.h> #include <Windows.h> void main(void) { // 仅在代码块开头声明一次HRESULT变量 HRESULT hr = CoInitialize(NULL); IGraphBuilder *pGraph; IMediaControl *pControl; IMediaEvent *pEvent; if (FAILED(hr)) { printf("FAIL"); } else { printf("PASS"); } // 直接赋值,不再重复声明HRESULT hr hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,&IID_IGraphBuilder, (void **)&pGraph); if (SUCCEEDED(hr)) { hr = pGraph->lpVtbl->QueryInterface(pGraph,&IID_IMediaControl, (void**)&pControl); hr = pGraph->lpVtbl->QueryInterface(pGraph,&IID_IMediaEvent, (void**)&pEvent); } // 务必记得释放COM对象并清理环境,避免内存泄漏 if (pEvent) pEvent->lpVtbl->Release(pEvent); if (pControl) pControl->lpVtbl->Release(pControl); if (pGraph) pGraph->lpVtbl->Release(pGraph); CoUninitialize(); }
额外提醒
- 每次调用COM接口函数后,建议检查
hr的返回值,避免后续操作使用无效指针; - 程序退出前必须释放所有创建的COM接口对象,并调用
CoUninitialize()完成COM环境的清理。
内容的提问来源于stack exchange,提问作者AerospaceMilitary420
相关产品推荐
相关产品推荐

