65.9K
CodeProject 正在变化。 阅读更多。
Home

COM 类别组合框

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2001年10月5日

2分钟阅读

viewsIcon

59756

downloadIcon

1142

一个组合框,列出指定 COM 类别的所有 COM 对象

Sample Image

引言

我喜欢基于组件的编程方式。在阅读了 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 对象,你有两种解决方案

  1. 读取注册表中以下位置写入的值HKLM\SOFTWARE\Tech Head\COMCategoryComboBox\IE 浏览器 BandIID
  2. 使用 CComboBox::GetItemDataPtr 来检索与指定组合框项目关联的应用程序提供的 32 位值,该值是指向包含接口标识符(IID)的 CString 的指针。

遇到的问题

目前没有(;-)。

历史

版本1.01 2001 年 10 月 4 日
。添加了对源代码的注释。
。在 Tech Head 网站上更新了文章。
。将文章提交到 Codeproject 网站。
版本 1.00 2001 年 10 月 3 日
。将文章添加到 Tech Head 网站。
© . All rights reserved.