Programming 版 (精华区)

发信人: lofe ()感激生活(), 信区: Programming
标  题: 全面理解COM+ 6
发信站: 哈工大紫丁香 (Sun Sep  3 08:14:05 2000), 转信

欢迎加入5ADs.com, 0.60元/点击!
 CSDN主页
    Visual C++   Visual Basic   Delphi   文件格式   网友文集   软件发布   专
家门诊   精品图书   人才市场
用过Visual Basic 6.0的读者一定有这样的体会,在VB6中编写自动化(Automation)组件
非常简单,只要按常规的方法编写“Class Module”即可实现COM组件。Vb6编译器承担
了所有的底层细节处理任务,对于程序员而言只是一些“Class Module”。虽然这种开
发模式限制了程序员的控制能力,但对于大多数情况,VB6不失为一个快速实现COM组件
的开发环境。
COM+推出之后,它的开发模式也将有一些转变,尤其对于Visual C++程序员,在编译时
刻程序员可以在代码中使用一些说明性的语句来设置COM+组件的属性,比如CLSID、Pro
gID、线程模型以及双接口等,如果不指定这些属性,编译器将使用缺省值。以前我们为
了使COM组件支持某些非缺省的特性,我们必须通过编写代码来实现这些特性,所以程序
员一定要对各种特性了解得非常清楚才能够编写出正确的代码来,这也是实现COM组件的
一个难点。COM+一方面与操作系统紧密结合,另一方面从开发的角度来讲,COM+将进一
步与编译器结合,它将扩展C++的一些语法,使得我们可以在代码中描述COM+特性,然后
由编译器直接提供这些特性的支持,从而减少程序员的工作量,提高COM+组件的生产效
率。
在代码中利用说明性的语句指示编译器产生与COM+组件有关的元数据(metadata),COM+
运行系统将利用这些元数据管理COM+组件。从某种意义上讲,我们可以认为元数据是一
些类型库信息,所以,实际上支持COM+组件的C++开发系统将把IDL/ODL的语法与C++语法
结合起来。后面讲到基于属性的编程模型时我们将会看到这种情况。
全面支持COM+组件的开发工具要等到Windows 2000发布之后,在Visual Studio的下一个
版本中才可能实现。作为一种兼容的方案,在现在的Visual C++版本中,编译器仍然只
支持原先的C++语法,当它在预处理过程中,碰到说明性的描述信息时,它把这些属性信
息交给属性分析器去处理,属性分析器是一个编译扩展模块,它把属性信息转换成C++代
码,然后送回编译器,编译器再把这些源代码编译到目标代码中。属性分析器产生的其
他一些信息,比如类型信息,也被编入最终代码。编译器的结构如图10所示。
图10 COM+组件编译过程示意图
2.基于属性的C++编程语言
基于属性的编程模型将直接把COM+组件的属性信息写到C++源代码中,指导编译器产生C
OM+组件,这样可以使程序员不必编写底层的处理代码,因为这些代码对于几乎所有的组
件都差不多,因此让开发工具直接产生这些代码可避免重复劳动。这种方式比MFC的宏以
及ATL的模板类更为直接。
属性并没有影响基本的C++语义,并且属性的语法也比较简单。属性可以用在任何说明性
的语句前面,比如C++类的声明、变量的声明都可以在其前面用方括号指定其属性。需要
注意的是,通常我们不在类型或者实例定义语句中指定属性信息。下面的代码说明了属
性的用法:
[
                  uuid("346bf467-3467- d211-23c6-000000000000"),
         helpstring("IMyInterface Interface"),
]
interface IMyInterface : IUnknown
{
   HRESULT Func1 ( [in] long, [out,retval] long* );
   HRESULT Func2 ( [in] long, [out,retval] long* );
};
[
                   coclass,
         progid("MyComp.MyObj.1"),
         uuid("346bf468-3467- d211-23c6-000000000000"),
                   helpstring("MyObj Class")
]
class CMyObj : public IMyInterface
{
public:
    CMyObj ();
// IMyInterface
public:
   HRESULT Func1 ( [in] long, [out,retval] long* );
   HRESULT Func2 ( [in] long, [out,retval] long* );
  ……
};
如果读者熟悉IDL或者ODL语法,那么对上面例子中的属性描述一定非常清楚。Visual C
++的属性分析器分析属性关键字,并产生相应的C++源代码(实际上是ATL代码)。下表列
出了属性分析器支持的一些常用属性关键字。
<<<上一页  返回  下一页>>>
----------------------------------------------------------------------------
----
美达美简介 | 邮购专栏 | 给我们写信 | 程序员大本营 | 英语步步高
美达美科技有限公司 版权所有 ?1998-1999

--
※ 修改:.haojs 于 Sep  3 08:11:41 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.451毫秒