[求助]:IDirectSoundCapture和IMoniker的關係?

aachenG 2003-09-11 02:54:22
情況是這樣的:
(1)因為工作需要,對一個音頻捕捉設備,我既要通過GUID使用IDirectSoundCapture,又要通過IMoniker來取得設備的Displayname.
(2)其中GUID是使用DirectSoundCaptureEnumerate()得到的,IMoniker是通過ICreateDevEnum::CreateClassEnumerator()得到的.一種是DirectSound的方法,一種是DirectShow的方法!
(3)問題是,當機器上有多個音頻捕捉設備時,兩種方法都得到了一個設備集合,我如何才能把兩個集合中相同的設備對應起來?

以上得到的同一個設備的IDirectSoundCapture和IMoniker,難道它們沒有甚麼聯系嗎?怎麼才能得到同一個設備的GUID和displayname?
請高手指點!
...全文
62 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingeagle 2003-09-12
  • 打赏
  • 举报
回复
我想微软不是大傻瓜,;)无论你用什么方法去寻找你关心的设备,你得到的结果应该是一样的啊!
利用IMoniker的方法你就可以得到设备的displayname了.同时利用IMoniker的方法GetClassID你就可以得到相应设备的GUID了.下面的你就可以做你想做的事情了吧.
dreameasy 2003-09-12
  • 打赏
  • 举报
回复
顶!
aachenG 2003-09-12
  • 打赏
  • 举报
回复
GetClassID我是已經試過的,得到的GUID是一個Class ID.無論是Video capture, 還是Audio capture, 或者audio renderer,得到的都是CLSID_DeviceMoniker這個常量.
我的問題,我已經找到解決的辦法了.原來相同類型的設備,它們的displayname並不一定是唯一的.對video capture,相同類型的,也有不同的displayname;而對於audio capture和renderer,形同類型的,displayname是一樣的,形式都是"@device:cm:{CLSID_AudioInputDeviceCategory}\Friendlyname".所以我可以在需要的時候自己構造一個displayname.
aachenG 2003-09-11
  • 打赏
  • 举报
回复
没人知道吗?
up
//指定视频采集设备的友好名字,为它创建一个Filter IBaseFilter * CTestPreviewDlg::CreateVideoDevice(const char * inFriendlyName) { return CreateHardwareFilter(CLSID_VideoInputDeviceCategory,inFriendlyName); } //根据设备的友好名字,创建一个代表该设备的Filter IBaseFilter * CTestPreviewDlg::CreateHardwareFilter(GUID inCategory,const char * inFriendlyName) { //创建一个系统枚举组件对象 ICreateDevEnum * enumHardware = NULL; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL, IID_ICreateDevEnum,(void**)&enumHardware); if(FAILED(hr)) { return NULL; } IBaseFilter * hardwareFilter = NULL; IEnumMoniker * enumMoniker = NULL; //为指定的目录创建枚举器 hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0); if(enumMoniker) { enumMoniker->Reset(); ULONG fetched = 0; IMoniker * moniker = NULL; char friendlyName[256]; //枚举得到该目录下所有的设备,逐个进行名字匹配 while(!hardwareFilter && SUCCEEDED(enumMoniker->Next(1,&moniker, &fetched)) && fetched) { if(moniker) { IPropertyBag * propertyBag = NULL; VARIANT name; friendlyName[0] = 0; hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&propertyBag); //读取设备的友好名字 if(SUCCEEDED(hr)) { name.vt = VT_BSTR; hr = propertyBag->Read(L"Friendlyname",&name,NULL); } if(SUCCEEDED(hr)) { WideCharToMultiByte(CP_ACP,0,name.bstrVal,-1, friendlyName,256,NULL,NULL); //如果当前设备的友好名字与用户指定的设备名字相同, //则将当前设备标识绑定为Filter形式 if(strcmp(friendlyName,inFriendlyName) == 0) { moniker->BindToObject(0,0,IID_IBaseFilter, (void**)&hardwareFilter); } } //释放使用过的接口 if(propertyBag) { propertyBag->Release(); propertyBag = NULL; } moniker->Release(); } } enumMoniker->Release(); } enumHardware->Release(); return hardwareFilter; }
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元
org.eclipse.swt.SWT.class org.eclipse.swt.SWTError.class org.eclipse.swt.SWTException.class org.eclipse.swt.accessibility.ACC.class org.eclipse.swt.accessibility.Accessible.class org.eclipse.swt.accessibility.AccessibleActionAdapter.class org.eclipse.swt.accessibility.AccessibleActionEvent.class org.eclipse.swt.accessibility.AccessibleActionListener.class org.eclipse.swt.accessibility.AccessibleAdapter.class org.eclipse.swt.accessibility.AccessibleAttributeAdapter.class org.eclipse.swt.accessibility.AccessibleAttributeEvent.class org.eclipse.swt.accessibility.AccessibleAttributeListener.class org.eclipse.swt.accessibility.AccessibleControlAdapter.class org.eclipse.swt.accessibility.AccessibleControlEvent.class org.eclipse.swt.accessibility.AccessibleControlListener.class org.eclipse.swt.accessibility.AccessibleEditableTextAdapter.class org.eclipse.swt.accessibility.AccessibleEditableTextEvent.class org.eclipse.swt.accessibility.AccessibleEditableTextListener.class org.eclipse.swt.accessibility.AccessibleEvent.class org.eclipse.swt.accessibility.AccessibleHyperlinkAdapter.class org.eclipse.swt.accessibility.AccessibleHyperlinkEvent.class org.eclipse.swt.accessibility.AccessibleHyperlinkListener.class org.eclipse.swt.accessibility.AccessibleListener.class org.eclipse.swt.accessibility.AccessibleTableAdapter.class org.eclipse.swt.accessibility.AccessibleTableCellAdapter.class org.eclipse.swt.accessibility.AccessibleTableCellEvent.class org.eclipse.swt.accessibility.AccessibleTableCellListener.class org.eclipse.swt.accessibility.AccessibleTableEvent.class org.eclipse.swt.accessibility.AccessibleTableListener.class org.eclipse.swt.accessibility.AccessibleTextAdapter.class org.eclipse.swt.accessibility.AccessibleTextAttributeEvent.class org.eclipse.swt.accessibility.AccessibleTextEvent.class org.eclipse.swt.accessibility.AccessibleTextExtendedAdapter.class org.eclipse.swt.accessibility.AccessibleTextExtendedListener.class org.eclipse.swt.accessibility.AccessibleTextListen

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧