Directshow学习笔记

关于directshow的学习,我一直感觉有很多困惑的地方。微软的东西不是讲究简单吗,但我感觉directshow中的音视频采集远没有linux下的v4l2好用。

创建一个com实例,需要涉及到两个ID,CLSID(下面函数的第一个参数)和iid(下面函数的第四个参数),这两个ID定位了一个要返回的接口的ID.

 CoCreateInstance (CLSID_SystemDeviceEnum,NULL, CLSCTX_INPROC,  IID_ICreateDevEnum, (void **) &pDevEnum);

IPropertyBag *pPropBag;

Imoniker,现在只能理解成,可以把一个设备看成是一个Imoniker。

IBaseFilter,是一个Filter的接口,为了实现在FilterGraph中的统一,所有的Filter都有一个IBaseFilter接口,并将其暴露在外。在创建一个Filter时总是可以首先获得该接口,然后通过该接口访问其他接口。

创建组件的最简单的方法是使用CoCreateInstance函数。

在COM库中包含一个用于创建组件的名为CoCreateInstance的函数。此函数需要一个CLSID参数,在此基础上创建相应组件的一个实例,并返回此组件的某个接口。

CoCreateInstance 的声明

HRESULT _stdcall  CoCreateInstance(REFCLSID rclsid,

                                         LPUNKNOWNpUnkOuter,

                                         DWORD dwClsContext,

                                         REFIIDriid,

                                         LPVOID* ppv);

 

第一个参数:待创建组件的CLSID。

第二个参数:用于聚合组件。

第三个参数:dwClsContext的作用是限定所创建的组件的执行上下文。

第四个参数:iid为组件上待使用的接口的iid。

 

 

类上下文

CoCreateInstance的第三个参数dwClsContext可以控制所创建的组件是在与客户相同的进程中运行,还是在不同的进程中运行,或者是在另外一台机器上运行。

CLSCTX_INPROC_SERVER

客户希望创建在同一进程中运行的组件。为能够同客户在同一进程中运行,组件必须是在DLL中实现。

CLSCTX_INPROC_HANDLER

客户希望创建进程中处理器。一个进程中处理器实际上是一只实现了某个组件一部分的进程中组件。该组件的基体附录将由本地或远程服务器上的某个进程外组件实现。

SLSCTX_LOCAL_SERVER

客户希望创建一个在同一机器上的另外一个进程中运行的组件。本地服务器是由EXE实现的。

SLSCTX_REMOTE_SERVER

客户希望创建一个在远程机器上运行的组件。此标志需要分布式COM正常工作。

执行上下文标记的一些预定义组合

常量名称

CLSCTX_INPROC

CLSCTX_INPROC_SERVER

CLSCTX_INPROC_HANDLER

CLSCTX_ALL

CLSCTX_INPROC_SERVER

CLSCTX_INPROC_HANDLER

SLSCTX_LOCAL_SERVER

SLSCTX_REMOTE_SERVER

CLSCTX_SERVER

CLSCTX_INPROC_SERVER

SLSCTX_LOCAL_SERVER

SLSCTX_REMOTE_SERVER

 

另外要说明的是,CLSCTX_REMOTE_SERVER值只是在包含OBJEBASE.H之前将_WIN32_WINNT的值定义为大于或等于0x0400时才会被加到CLSCTX_ALL和CISCTX_SERVER中(在包含OBJEBASE.H之前定义_WIN32_DCOM的效果将是一样的。)若在某个不支持DCOM的系统中将CLSCTX_REMOVE_SERVER值会以给CoCreateInstance,此函数将会失败并返回一个E_INVALIDARG值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值