COM编程技术基础概述之五

news/2024/9/27 20:54:17 标签: 编程, object, 工具, library, calendar, properties

 

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}}
};

  这里通过coclass关键字定义了对象类型信息,ClassWizard将据此建立相应的包装类。library关键字描述了当前库信息,并可通过importlib关键字引入其他的类型库。

http://www.niftyadmin.cn/n/944855.html

相关文章

COM编程技术基础之四

COM编程技术基础之四<script></script> 所谓自动化对象&#xff0c;指的是实现了IDispatch接口的COM对象&#xff0c;IDispatch接口是自动化对象的一个重要标志。使用自动化技术的一个主要目的就是对COM的一些底层操作进行简化。包括自动化组件和自动化客户两方…

COM编程技术基础概述之六

COM编程技术基础概述之六<script></script> 在直接使用类型库时&#xff0c;应首先将类型库装载到内存&#xff0c;这可以通过多种方式进行。对于已注册到注册表中的类型库&#xff0c;可以使用LoadRegTypeLib&#xff08;&#xff09;装载。如果知道类型库的准…

VC6和VS2003 转换到VS2005 时可能会遇到的问题以及解决方法

经常写VC工程的人都会遇到升级到VS2005时出现的各种各样的问题&#xff0c;下面写一些自己遇到的问题&#xff0c;还有什么不全的请大家补充。希望能给朋友们一些帮助。1.以前可以这样用try catchcatch(CException *e){ pApp->Warn("%s",e->GetErrorMess…

VC数据类型转换大全(1)

VC数据类型转换大全 int i 100;long l 2001;float f300.2;double d12345.119;char username[]"程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10);///将i转换为字符串放入temp中,最…

VC数据类型转换大全(2)

三、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)str.Format("%d",i); 浮点数(float)str.Format("%f",i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值str username; 对于Format所不支持的数据…

c++ 非虚拟继承可以正常使用,虚拟继承后执行的问题

本文源于C对话系列 类层次结构相当简单&#xff1a; class parent{public:virtual void f();// etc...};class child : public virtual parent{public:void f();};我所做的修改之一就是把child虚拟地继承于parent,使它在这个类层次结构的任何地方都能使用。我尽了最大努力&a…

c++ 16进制转化为10进制的几种方法

第一种方法: int hex_char_value(char c) { if(c > 0 && c < 9) return c - 0; else if(c > a && c < f) return (c - a 10); else if(c > A && c < F) return (c - A 10); assert(0); return 0; } int hex…

飞鸽传书的实现原理

&#xff08;1&#xff09;最关键的是局域网用户列表的建立&#xff1b;飞鸽传书数据包启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,默认端口是2425。广播包内容包含用户名、工作组、主机名、IP等信息&#xff1b;已启动飞鸽的用户通过2425端口收到此广播包后&a…