仓酷云
标题: JAVA网站制作之COM 组件计划与使用(五)用 ATL 写第一个组件仓酷云 [打印本页]
作者: 因胸联盟 时间: 2015-1-18 11:37
标题: JAVA网站制作之COM 组件计划与使用(五)用 ATL 写第一个组件仓酷云
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。下载源代码
1、媒介
1、假如你在利用vc5.0及之前的版本,请你晋级为vc6.0或vc.net2003;
2、假如你在利用vc6.0(ATL3.0)请浏览本回内容;
3、假如你在利用vc.net(ATL7.0)请浏览下回内容;(固然读读本文内容也不错)
4、这第一个组件,除一切COM组件必需的IUnknown接口外,我们再完成一个本人界说的接口IFun,它有两个函数:Add()完成两个数值的加法,Cat()完成两个字符串的毗连。
5、上面......好难听讲!入手下手了:-)
2、创建ATL工程
步骤2.1:创建一个事情区(WorkSpace)。
步骤2.2:在事情区中,创建一个ATL工程(Project)。示例程序叫Simple1,并选择DLL体例,见图一。
<br>
、创建ATLDLL工程
DynamicLinkLibrary(DLL)暗示创建一个DLL的组件程序。
Executable(EXE)暗示创建一个EXE的组件程序。
Service(EXE)暗示创建一个服务程序,体系启动后就会加载并实行的程序。
Allowmergingofproxy/stubcode选择该项暗示把“代办署理/存根”代码兼并到组件程序中,不然必要独自编译,独自注册代办署理存根程序。代办署理/存根,这个是甚么观点?还记得我们在上回书中先容的吗?当挪用者挪用历程外或远程组件功效的时分,实际上是代办署理/存根卖力数据互换的。关于代办署理/存根的详细酿成和操纵,今后再说啦......
SupportMFC除非有特别的缘故原由,我们写ATL程序,最好不要选择该项。你大概会说,假如没有MFC的撑持,那CString怎样办呀?告知你个奥密吧,常人我都不告知他,我后半辈子就靠着这个奥密在世了:
1、你会STL吗?能够用STL中的string取代;
2、本人写个MyString类,嘿嘿;
3、悄然地、奥密地、不要告知他人(出格是别告知微软),把MFC中的CString源码拿过去用;
4、利用CComBSTR类,最少也能简化我们字符串操纵;
5、间接用API操纵字符串,归正我们人人进修C言语的时分,都是从这里干起的。(即是没说,呵呵)
SupportMTS撑持事件处置,也就是是不是撑持COM+功效。COM+大概在第99回先容吧。
3、增添ATL对象类
步骤3.1:菜单InsertNewATLObject...(大概用鼠标右键在ClassView卡片中弹出菜单)并选择Object分类,选中SimpleObject项目。见图二。
<br>
、选择创建复杂COM对象
CategoryObject一般组件。个中能够选择的组件对象范例良多,但实质上,就是让导游帮我们默许加上一些接口。好比我们选"SimpleObject",则导游给我们的组件加上IUnknown接口;我们选"InternetExplorerObject",则导游除加上IUnknown接口外,再增添一个给IE所利用的IObjectWithSite接口。固然了,我们完整能够手工增添任何接口。
CategoryControlsActiveX控件。个中能够选择的ActiveX范例也良多。我们在后续的专门先容ActiveX编程中再会商。
CategoryMiscellaneous帮助杂类组件。
CategroyDataAccess数据库类组件(我最厌恶数据库编程了,以是我也不会)。
步骤3.2:增添自界说类CFun(接口IFun),见图三。
<br>
、输出类中的各项称号
实在,我们只必要输出短名(ShortName),别的的项目会主动填写。没甚么多说的,只请人人注重一下ProgID项,默许的ProgID机关体例为“工程名.短名”。
步骤3.3:填写接口属性,见图四。
<br>
、接口属性
ThreadingModel选择组件撑持的线程模子。COM中的线程,我以为是最厌恶,最庞大的部分。COM线程和公寓的观点,留待后续先容。如今吗......人人都选Apartment,它代表甚么那?复杂地说:当在线程中挪用组件函数的时分,这些挪用会列队举行。因而,这类形式下,我们能够临时不必思索同步的成绩。(注1)
Interface接口基础范例。Dual暗示撑持双接口(注2),这个十分十分主要,十分十分经常使用,但我们明天不讲。Custom暗示自界说托言。牢记!牢记!我们的这第一个COM程序中,必定要选择它!!!!(假如你选错了,请删除全体内容,从头来过。)
Aggregation我们写的组件,未来是不是同意被他人聚合(注3)利用。Only暗示必需被聚合才干利用,有点相似C++中的纯虚类,你如果总工程师,只卖力计划但不亲身写代码的话,才选择它。
SupportISupportErrorInfo是不是撑持丰厚信息的毛病处置接口。今后就讲。
SupportConnectionPoints是不是撑持毗连点接口(事务、回调)。今后就讲。
FreeThreadedMarshaler今后也不讲,就算打逝世你,我也不说!(注4)
4、增加接口函数
<br>
、修改增添接口办法的菜单
<br>
、增添接口函数Add
<br>
、增添接口函数Cat
请严厉依照图六的体例,增添Add()函数;因为图七中增添Cat()函数的参数对照长,我没有得当的输出空格,请人人本人输出的时分注重一下。[in]暗示参数偏向是输出;[out]暗示参数偏向是输入;[out,retval]暗示参数偏向是输入,同时能够作为函数运算了局的前往值。一个函数中,能够有多个[in]、[out],但[retval]只能有一个,而且要和[out]组合后在最初一个地位。(注5)
<br>
、接口函数界说完成后的图示
我们都晓得,要想改动C++中的类函数,必要修正两个中央:一是头文件(.h)中类的函数声明,二是函数体(.cpp)文件的完成处。而我们如今用ATL写组件程序,则还要修正一个中央,就是接口界说(IDL)文件。别发急IDL下次就要会商啦。
因为vc6.0的BUG,招致人人在增添完接口和接口函数后,大概不会向上图(图八)所体现的款式。办理办法:
1封闭工程,然后从头翻开该办法经常无效2封闭IDE,然后从头运转 3翻开IDL文件,反省接口函数是不是准确,如不准确请修正 4翻开IDL文件,任意修正一下(加一个空格,再删除这个空格),然后保留该办法经常无效5翻开h/cpp文件,反省函数是不是存在或是不是准确,有则改之无则嘉勉,不说完这个成语心思别扭6删除IDL/H/CPP中的接口函数,然后再来一遍7从头创建工程、从头安装vc、从头安装windows、砸盘算机砸!
5、完成接口函数
鼠标双点图八中CFunIFunAdd(...)就能够入手下手输出函数完成了:- 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""