COM 类别组合框





3.00/5 (2投票s)
2001年10月5日
2分钟阅读

59756

1142
一个组合框,列出指定 COM 类别的所有 COM 对象
引言
我喜欢基于组件的编程方式。在阅读了 COM 分类相关主题后,我开始思考为我的应用程序创建插件的一种可能方式。最初的想法是在家思考工作时产生的。我们进行指纹识别,并使用多种硬件来捕获指纹图像。因此,我将指纹扫描仪概括为提供指纹图像的硬件设备。然后,我构建了一个对所有扫描仪通用的接口。现在,我们可以选择在运行时使用的扫描仪。
您可以在 Len Holgate 的文章中获得更多信息:编写可扩展的应用程序,组件类别管理器包装类。
ComboBox
组合框是根据代表 COM 类别的 CATID(UUID)构建的。它使用 ICatInformation 在注册表中搜索实现该类别的所有 COM 对象。然后,它将它们添加到组合框的列表框中。它还将与组合框中指定项目关联的 32 位值设置为一个 CString 指针,其中包含接口标识符(IID)。这将允许根据用户选择在运行时创建 COM 对象。为了优化显示速度,组合框仅在用户单击下拉菜单时搜索注册表。它还会将最新选择的值缓存到注册表中,以加快创建速度。
用法
要使用此 WTL 控件,请在对话框上放置一个组合框。在对话框实现文件中添加一个成员变量
CCOMCategoriesComboBox m_catCombo;
在 OnInitDialog()
事件处理程序中,添加以下行
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { ... // Attach controls to members m_catCombo.SubclassWindow( GetDlgItem(IDC_COMBO_CAT) ); ... }
将以下反射宏添加到你的主消息映射中
BEGIN_MSG_MAP(CMainDlg) ... REFLECT_NOTIFICATIONS() END_MSG_MAP()
使用此方法在对话框构造函数中初始化 CCOMCategoriesComboBox
CMainDlg() : m_catCombo( "{00021493-0000-0000-C000-000000000046}", // Internet Explorer Browser Band CATID CString(_T("SOFTWARE\\Tech Head\\COMCategoryComboBox")), CString(_T("IE Browser Band")) ) { }
要获取用户选择的 COM 对象,你有两种解决方案
- 读取注册表中以下位置写入的值HKLM\SOFTWARE\Tech Head\COMCategoryComboBox\IE 浏览器 BandIID
- 使用
CComboBox::GetItemDataPtr
来检索与指定组合框项目关联的应用程序提供的 32 位值,该值是指向包含接口标识符(IID)的CString
的指针。
遇到的问题
目前没有(;-)。
历史
版本1.01 | 2001 年 10 月 4 日 。添加了对源代码的注释。 。在 Tech Head 网站上更新了文章。 。将文章提交到 Codeproject 网站。 |
版本 1.00 | 2001 年 10 月 3 日 。将文章添加到 Tech Head 网站。 |