分享

COM编程技术基础概述之五

 昵称225033 2014-01-05
COM编程技术基础概述之五
在COM组件的使用和开发过程中经常需要获取有关组件的信息。而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取。例如,这里在使用Calendar组件时就用到了它的ProgID--MSCAL.Calendar.7。通过VC++附带的OLE/COM Object Viewer工具将可以很方便的查看指定组件的全部注册表信息和类型库信息。

  图1是OLE/COM Object Viewer工具的程序界面。在左边的树视中列举了当前操作系统下所有注册了的COM组件对象。在Automation Objects分支下列举了所有的自动化对象(包括ActiveX控件)。在选中某个对象后,右边的属性页将显示此对象的相关信息。其中主要的信息如ProgID、CLSID等均在Registry页列出。如果需要进一步获取类型库信息,可以在对象上点击右键,并在弹出菜单中选取"View Type Information…"菜单项。这将启动如图2所示的ITypeLib Viewer工具。ITypeLib Viewer的左侧树视列出了控件的对象类、接口、方法等项。相应的,在选中某个具体的项目时,右侧视图将给出详细的内容信息。


图1 OLE/COM Object Viewer


图2 ITypeLib Viewer

  除了可以使用OLE/COM Object Viewer工具得到这些信息外,也可以通过访问类型库也可以达到同样的目的。在类型库中以二进制的形式描述了一个或多个对象的类型信息。具体的类型信息包括:组件的CLSID、所支持接口的IID、接口的成员函数及其参数和返回值类型等。通过#import预编译指令和ClassWizard两种不同的方式可以从类型库获取对象的类型信息。其中在使用ClassWizard时,将可以根据类型库中的描述信息建立相应的以C++语言编写的包装类。通过此包装类将能很方便的在客户程序中使用组件对象提供的属性和方法。在组件程序中,类型库的创建是根据.odl文件中的描述进行编译的。下面给出一段.odl文件描述:

[ uuid(66ACC255-A531-4153-91E6-864FEBEAE832), version(1.0) ]
library Sample63
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
// Primary dispatch interface for CTest
[ uuid(C19A7247-C812-48D4-AC58-41BA4B412839) ]
dispinterface ITest
{
properties:
// NOTE - ClassWizard will maintain property information here.
// Use extreme caution when editing this section.
//{{AFX_ODL_PROP(CTest)
[id(1)] VARIANT Message;
//}}AFX_ODL_PROP
methods:
// NOTE - ClassWizard will maintain method information here.
// Use extreme caution when editing this section.
//{{AFX_ODL_METHOD(CTest)
[id(2)] VARIANT BackMessage();
//}}AFX_ODL_METHOD
};
// Class information for CTest
[ uuid(EFEA38A7-C61E-4ADD-9E8C-8D41058558AA) ]
coclass Test
{
[default] dispinterface ITest;
};
//{{AFX_APPEND_ODL}}
//}}AFX_APPEND_ODL}}
};

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多