关于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值。