在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文件描述:
这里通过coclass关键字定义了对象类型信息,ClassWizard将据此建立相应的包装类。library关键字描述了当前库信息,并可通过importlib关键字引入其他的类型库。
图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}} }; |
这里通过coclass关键字定义了对象类型信息,ClassWizard将据此建立相应的包装类。library关键字描述了当前库信息,并可通过importlib关键字引入其他的类型库。