You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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();
}

额外提醒

  1. 每次调用COM接口函数后,建议检查hr的返回值,避免后续操作使用无效指针;
  2. 程序退出前必须释放所有创建的COM接口对象,并调用CoUninitialize()完成COM环境的清理。

内容的提问来源于stack exchange,提问作者AerospaceMilitary420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:45:32