---本书英文版本于2001年出版.
JITA:just-in-Time Activation即时激活,组件被调用时实例化组件,在组件完成工作后丢弃组件.
目前,大多数 Windwos企业级开发者都是在现有COM标准的基础上使用VB6.0和VC6.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+应用程序,程序运行会出错.(但可惜没添加异常处理,只能被活活弄死!)