ATL实现COM--DLL形式

---本书英文版本于2001年出版.

JITA:just-in-Time Activation即时激活,组件被调用时实例化组件,在组件完成工作后丢弃组件.

 

目前,大多数 Windwos企业级开发者都是在现有COM标准的基础上使用VB6.0VC6.0(包括ATL)开发应用程序的.

 

应用程序包含组件,组件包含接口,接口包含方法

 

创建COM+应用程序步骤:

1:创建传统的COM组件.所有的COM+组件都是以传统的COM组件为起点.

vc.net中用ATL7.0创建一个ATL项目,名字为:”Hello”

添加一个新的ATL简单对象

类名为message, coclass名为Hello

 

为接口Imessage添加方法 ShowMessage();---没有参数.

Imessage类中完成ShowMessage()的定义

STDMETHODIMP Cmessage::ShowMessage(void)

{

     // TODO: 在此添加实现代码

     ::MessageBox(::GetActiveWindow(),"Hello COM+","First COM+ Application",MB_OK);

 

       return S_OK;
}
: 所有的COM+组件都必须驻留在DLL,DLL必须包含作为资源嵌入的类型库.COM+并不要求注册组件
.
2:
创建容纳组件的COM+应用程序

在组件服务管理器(Component Server Explorer),组件服务à计算机à我的电脑àCOM应用程序;右键à新建à应用程序à下一步,创建空应用程序à输入应用程序名:Hello COM+;激活类型:库应用程序(库应用程序Library Application表示应用程序的组件将直接加载到客户端进程类似于传统的COM进程内服务)(服务器应用程序:表示组件将运行在自己的进程内---类似于传统的COM本地服务器)à完成.

3:把组件添加到应用程序(步骤2建立的应用程序)

在应用程序Hello COM+下的组件文件夹上右键à新建à组件à下一步à安装新组件(第二个特别的没用,第三个还没介绍)à选择第一步建立的DLL文件(拆包提取其中的类型库,并查找coclass的定义.意思是一个coclass定义后就是一个组件!!)à打开à(删除掉你不要的组件.第一步建立的时候可以建立多于一个的COM组件---添加新类后选择的ATL简单对象,一个ATL简单对象就是一个COM组件)下一步à完成.

Coclass的说明:

library HelloLib

{

     importlib("stdole2.tlb");

     [

         uuid( 283F 68ED-F402-4EFA-A659-62CF73FCA 3F 3),

         helpstring("Hello Class")

     ]

     coclass Hello

     {

         [default] interface Imessage;//可以有多个

     };

};
类型库的coclass定义包含的每个接口都在组件服务管理器中的接口文件夹下有一个条目.

4:写客户端并测试组件

测试代码如下:

#import “Hello.dll” no_namespace named_guids//应该包含完整的路径名,//C:/Documents and Settings/li/My Documents/Visual Studio //Projects/Hello/Debug/ Hello.dll---还有一个很重要的特点,导入该DLL文件只是为了获取里面的类型库信息,用于下面的Imessage,ShowMessage()的使用.编译链界成exe后可以对DLL(包括位置等)重新配置.下面的CLSID_Hello才是关键的地方.
::CoInitialize(NULL);
 
HRESULT hres=S_OK;
Imessage* pMessage=NULL;
Hres=::CoCreateInstance(CLSID_Hello,NULL,CLSCTX_ALL,IID_Imessage,(void**)&pMessage);
 
Hres=pMessage->ShowMessage();
pMessage->Release();
::CoUnInitialize();//word弄得开头自动大写了,要改回来的

第一印象,DLL有什么不同??

试着禁用组件服务管理器中的Hello COM+COM+应用程序,程序运行会出错.(但可惜没添加异常处理,只能被活活弄死!)

COM+组件只允许导入进程内(DLL)组件,不能导入驻留在本地服务器(EXE)COM组件.另外,COM+允许配置应用程序,服务器或库的激活类型.

对于库:客户端只需要把原始DLL加载到自己的进程即可使用其中的组件.

 

 

配置组件:导入COM+(指的就是组件服务管理器)的进程内组件强调许多组件的功能和行为实际上都是在组件外部配置和管理的事实.(在组件服务管理器中配置和管理)

未配置组件:没有导入COM+的传统COM组件(进程内的或本地的)

组件服务管理器:减少了COM组件的设计难度(可以在组件服务管理器中手动管理,配置而不用代码来实现.非常好的手段).利用COM+(就是那个管理器)提供的各种服务来代替自己的开发,从而把对象的代码集中于预期目标.

 

COM+不使用注册表,而是使用名为:COM+类别目录(catalog)的专用仓库.

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值