JAVA网页设计COM 组件计划与使用(六)用 ATL 写第一个组件仓酷云
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。下载源代码1、媒介
1、与《COM组件计划与使用(五)》的内容基础分歧。但本回解说的是在vc.net2003下的利用办法,即便你不再利用vc6.0,也请和上一回的内容,参照比对。
2、这第一个组件,除一切COM组件必需的IUnknown接口外,我们再完成一个本人界说的接口IFun,它有两个函数:Add()完成两个数值的加法,Cat()完成两个字符串的毗连。
3、上面......好难听讲!入手下手了:-)
2、创建ATL工程
步骤2.1:创建一个办理计划。
步骤2.2:在该办理计划中,新建一个vc++的ATL项目。示例程序叫Simple2,并选择DLL体例,见、图二。
<br>
、新建ATL项目
<br>
、选择非属性化的DLL组件范例
属性化属性化编程,是将来的偏向,但我们如今先不要选它。
静态链接库(DLL)选择它。
可实行文件(EXE)今后再讲。
服务(EXE)暗示创建一个体系服务组件程序,体系启动后就会加载并实行的程序。
同意兼并代办署理/存根(stub)代码选择该项暗示把“代办署理/存根”代码兼并到组件程序中,不然必要独自编译,独自注册代办署理存根程序。代办署理/存根,这个是甚么观点?还记得我们在上回书中先容的吗?当挪用者挪用历程外或远程组件功效的时分,实际上是代办署理/存根卖力数据互换的。关于代办署理/存根的详细酿成和操纵,今后再说啦......
撑持MFC除非有特别的缘故原由,我们写ATL程序,最好不要选择该项。你大概会说,假如没有MFC的撑持,那CString怎样办呀?告知你个奥密吧,常人我都不告知他,我后半辈子就靠着这个奥密在世了:
1、你会STL吗?能够用STL中的string取代;
2、本人写个MyString类,嘿嘿;
3、悄然地、奥密地、不要告知他人(出格是别告知微软),把MFC中的CString源码拿过去用;
4、利用CComBSTR类,最少也能简化我们字符串操纵;
5、间接用API操纵字符串,归正我们人人进修C言语的时分,都是从这里干起的。(即是没说,呵呵)
撑持COM+1.0撑持事件处置的COM+功效。COM+大概在第99回先容吧。
3、增加ATL对象类
步骤3.1:菜单"项目增加类..."(大概用鼠标右键在项目中弹出菜单"增加增加类...")并选择ATL复杂对象。见图三。
<br>
、选择创建ATL复杂对象
除复杂对象(只完成了IUnknown接口),还能够选择“ATL控件”(ActiveX,完成了10多个接口)......能够选择的组件对象范例良多,但实质上,就是让导游帮我们默许加上一些接口。在今后的文章中,连续先容吧。
步骤3.2:增添自界说类CFun(接口IFun),见图四。
<br>
、填写称号
实在,我们只必要输出简称,别的的项目会主动填写。没甚么多说的,只请人人注重一下ProgID项,默许的ProgID机关体例为“项目名.简称名”。
步骤3.3:填写接口属性选项,见图五。
<br>
、接口选项
线程模子COM中的线程,我以为是最厌恶,最庞大的部分。COM线程和公寓的观点,留待后续先容。如今吗......人人都选"单位"(Apartment),它代表甚么那?复杂地说:当在线程中挪用组件函数的时分,这些挪用会列队举行。因而,这类形式下,我们能够临时不必思索同步的成绩。(注1)
接口。两重(Dual),这个十分十分主要,十分十分经常使用,但我们明天不讲(注2)。牢记!牢记!我们的这第一个COM程序中,必定要选择“自界说”!!!!(假如你选错了,请删除全体内容,从头来过。)
聚合我们写的组件,未来是不是同意被他人聚合(注3)利用。“只能创立为聚合”,有点相似C++中的纯虚类,你如果总工程师,只卖力计划但不亲身写代码的话,才选择它。
ISupportErrorInfo是不是撑持丰厚信息的毛病处置接口。今后就讲。
毗连点是不是撑持毗连点接口(事务、回调)。今后就讲。
IObjectWithSite是不是撑持IE的挪用
4、增加接口函数
<br>
、修改增添接口办法的菜单
<br>
、增添接口函数Add
请依照图示的办法,增添Add()函数,增添Cat()函数。暗示参数偏向是输出;暗示参数偏向是输入;暗示参数偏向是输入,同时能够作为函数运算了局的前往值。一个函数中,能够有多个、,但只能有一个,而且要和组合后在最初一个地位。(注4)
<br>
、接口函数界说完成后的图示
我们都晓得,要想改动C++中的类函数,必要修正两个中央:一是头文件(.h)中类的函数声明,二是函数体(.cpp)文件的完成处。而我们如今用ATL写组件程序,则还要修正一个中央,就是接口界说(IDL)文件。别发急IDL下次就要会商啦。
5、完成接口函数
鼠标双点图八中CFun基项和接口Add(...)就能够入手下手输出函数完成了:
STDMETHODIMPCFun::Add(longn1,longn2,long*pVal){*pVal=n1+n2;returnS_OK;}这个太复杂了,不再华侈“口条”。上面我们完成字符串联接的Cat()函数:STDMETHODIMPCFun::Cat(BSTRs1,BSTRs2,BSTR*pVal){intnLen1=::SysStringLen(s1); //s1的字符长度intnLen2=::SysStringLen(s2); //s2的字符长度*pVal=::SysAllocStringLen(s1,nLen1+nLen2);//机关新的BSTR同时把s1先保留出来if(nLen2){::memcpy(*pVal+nLen1,s2,nLen2*sizeof(WCHAR)); //然后把s2再毗连出来//wcscat(*pVal,s2);}returnS_OK;}先生:下面的函数完成,完整是挪用基础的API体例完成的。
先生:是的,说假话,切实其实对照啰嗦。
先生:我们是用memcpy()完成毗连第二个字符串功效的,那末为何不必函数wcscat()那?
先生:多半情形下能够,但你必要晓得:因为BSTR包括有字符串长度,因而实践的BSTR字符串内容中是能够存储L""