JAVA网站制作之COM组件计划与使用(八)完成多接口仓酷云
在性能方面,在windows平台下,.net网页编程可能是占强项,要是把.net网页编程放在sun开发的操作系统上去运行呢?根本就运行不了,.net网页编程对其它操作系统的支持也很弱,性能也可能比不上java。下载源代码1、媒介从第五回入手下手到第七回,我们用ATL写了一个复杂的COM组件,之以是说复杂,是由于在组件中,只完成了一个自界说(custom)的接口IFun。固然假如想偷懒的话,我们能够把200个函数都加到这一个接口中,果然云云的话,生怕就没有人喜好利用我们这个组件了。一个组件既然能够供应多个接口,那末我们在计划的时分,就应当依照函数的功效举行分类,把分歧功效分类的函数用多个接口体现出来。如许能够有以下的一些优点:
1、一个接口中的函数个数无限、功效会合,利用者简单进修、影象和挪用。一个接口究竟供应几个函数符合那?谜底是:假如你是黑猩猩,那末一个接口最多3个函数,假如你是人,那末一个接口最好不要凌驾7个函数。(注1)
2、简单保护。最少你肉眼搜刮的时分也便利一些呀。
3、简单晋级。当我们给组件增添函数的时分,不要修正已宣布的接口,而是供应一个新的接口来完乐成能扩大。(注2)
本回书下落在------怎样完成一个组件,多个接口。
2、接口布局
<br>
、组件A有2个自界说接口,组件B是A的晋级
某日,我们计划了组件A,它有2个自界说(custom)接口。IMathe有函数Add()完成整数加法,IStr有函数Cat()完成字符串联接。忽一日,我们晋级组件A到B,欲增添一个函数Mul()完成整数的乘法。注重,因为我们已宣布了组件A,因而我们不克不及把这个函数布置到老接口IMathe中了。办理办法是再界说一个新接口IMathe2,在新接口中增添Mul()函数并仍旧保存Add()函数。如许,老用户不晓得新接口IMathe2的存在,他仍旧利用旧接口IMathe;而新用户则能够丢弃IMathe,间接利用IMathe2的新接口功效。看,多平顺的晋级体例呀!
3、完成
3-1、起首用ATL完成一个自界说(custom)接口IMathe的COM组件,在接口中完成Add()整数加法函数。注重!!!必定是自界说(custom)的接口(dual双接口今后再先容)。假如你不懂得这个操纵,请从头浏览“第五回”或“第六回”。3-2、检察IDL文件。完成上一个步骤后,翻开IDL文件,内容以下:(称号及UUID会和你程序中的IDL有所分歧)
1import"oaidl.idl";2import"ocidl.idl";3 9 interfaceIMathe:IUnknown10 {11HRESULTAdd(longn1,longn2,long*pnVal);12 };1318librarySIMPLE3Lib19{20 importlib("stdole32.tlb");21 importlib("stdole2.tlb");22 26 coclassMathe27 {28interfaceIMathe;29 };30};1-2引进IUnknown和ATL已界说的别的接口形貌文件。import相似与C言语中的#include3-12一个接口的完全形貌4object暗示本块形貌的是一个接口。IDL文件是借用了PRC远程数据互换格局的申明办法5uuid(......)接口的IID,这个值是ATL主动天生的,能够手工修正或用guidgen.exe发生(注3)6在某些软件或工具中,能看到这个提醒7界说接口函数中参数所利用指针的默许属性(注4)9接口叫IMathe派生自IUnknown,因而IMathe接口的头三个函数必定就是QueryInterface,AddRef和Release10-12接口函数列表13-30范例库的完全形貌(范例库的观点今后再说),上面所申明的行,是必要先懂得的18#import时分的默许定名空间23组件的CLSID,CoCreateInstance()的第一个参数就是它27-29接口列表28暗示谁供应了IUnknown接口
3-3、手工修正IDL文件,黑体字部分是手工输出的。完成后保留。import"oaidl.idl";import"ocidl.idl";interfaceIMathe:IUnknown{HRESULTAdd(longn1,longn2,long*pnVal);}; [ //所谓手工输出,实在也是有技能的:把下面的接口形貌(IMathe)复制、粘贴上去,然后再改更便利哈object,uuid(072EA6CB-7D08-4E7E-B2B7-B2FB0B875595),//手工或用工具发生的IIDhelpstring("IStrInterface"),pointer_default(unique)]interfaceIStr:IUnknown{//今朝还没有任何接口函数};librarySIMPLE3Lib{importlib("stdole32.tlb");importlib("stdole2.tlb");coclassMathe{interfaceIMathe;interfaceIStr; //别忘了呦,这里另有一个那};};3-4、翻开头文件(Mathe.h),手工增添类的派生干系和接口出口表,然后保留。classATL_NO_VTABLECMathe:publicCComObjectRootEx<CComSingleThreadModel>,publicCComCoClass<CMathe,&CLSID_Mathe>,publicIMathe, //别忘了,这里加一个逗号publicIStr //增添一个基类{public:CMathe(){}DECLARE_REGISTRY_RESOURCEID(IDR_MATHE)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CMathe) //接口出口表。这里填写的接口,才干被QueryInterface()找到COM_INTERFACE_ENTRY(IMathe)COM_INTERFACE_ENTRY(IStr)END_COM_MAP()3-5、好了,统统停当。接上去,就能够在IStr接口中增添函数了。示例程序中增添一个字符串联接功效的函数:
HRESULTCat(BSTRs1,BSTRs2,BSTR*psVal);假如你不晓得怎样做,请从头浏览前三回的内容。
4、接口晋级
我们这个组件已刊行了,但溘然一天我们必要在IMathe接口上再增添一个函数......不可!相对不克不及在IMathe上间接修正!怎样办?办理办法是------再增添一个接口,我们就叫IMathe2吧,假如今后还要增添函数,那末我们再增添一个接口叫IMathe3......子子孙孙,无量尽也。
4-1、修正IDL文件,实在假如你了解了下面一大节的内容,再增添一个接口是很复杂的事变了。import"oaidl.idl";import"ocidl.idl";interfaceIMathe:IUnknown{HRESULTAdd(longn1,longn2,long*pnVal);};interfaceIStr:IUnknown{HRESULTCat(BSTRs1,BSTRs2,BSTR*psVal);}; interfaceIMathe2:IUnknown{ //上面这个Add()函数,只要IDL中的声明,而不必增添任何程序代码,由于这个函数早在IMathe中就已完成了HRESULTAdd(longn1,longn2,long*pnVal);};librarySIMPLE3Lib{importlib("stdole32.tlb");importlib("stdole2.tlb");coclassMathe{interfaceIMathe;interfaceIStr;interfaceIMathe2; //别忘了,这里另有一行呢!};};4-2、翻开头文件,增添派生干系和接口出口表classATL_NO_VTABLECMathe:publicCComObjectRootEx<CComSingleThreadModel>,publicCComCoClass<CMathe,&CLSID_Mathe>,publicIMathe,publicIStr, //这里增添一个逗号publicIMathe2{public:CMathe(){}DECLARE_REGISTRY_RESOURCEID(IDR_MATHE)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CMathe)COM_INTERFACE_ENTRY(IMathe)COM_INTERFACE_ENTRY(IStr)COM_INTERFACE_ENTRY(IMathe2)END_COM_MAP()4-3、示例程序中,增添了一个整数乘法函数:
HRESULTMul(longn1,longn2,long*pnVal);假如你不晓得怎样做,那就别学了:-(都讲好几遍了,怎样还不把握呢?晓得狗熊是怎样逝世的吗?(注5)
4-4、由于我们的组件晋级了,因而也应当修正版本号了(这不是必需的,但最好修正一下)。翻开注册表文件(.rgs)把有关ProgID的版本"Mathe.1"修正为"Mathe.2"。别的假如你乐意,把IDL文件中的version和提醒笔墨一并修正一下。这里就不再粘贴文件内容了,由于很复杂,人人下载示例程序(注6)后,本人看吧。
5、小结
为故国的软件奇迹而搏斗!
下回书先容“主动化”---IDispatch接口,好玩的很!感谢存眷:-)
注1:黑猩猩的瞬时影象量是3,人类的瞬时影象量是7。迷信家做过实行,当着面,把一块糖扣在3个碗的个中之一,黑猩猩能立即正确找到,但假如凌驾3个碗,猩猩就晕了......假如给你看一串数字,然后立即让你说出来,一样平常的人只会记得个中的7个。
注2:组件一经宣布,就不要修正已有接口。如许软件的晋级才干做到“鲁棒”性。
注3:guidgen.exe工具,在《COM组件计划与使用(二)》中已先容。
注4:组件函数对内存指针的处置,今后有专门的章回会商。
注5:笨逝世的!
注6:示例程序有两部分,分离是vc6.0版本和vc.net2003版本。
原文链接:http://www.vckbase.com/document/viewdoc/?id=1501
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net网页编程也不过3,4本书足以,这就是区别。 是一种突破用户端机器环境和CPU 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 是一种为 Internet发展的计算机语言 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 是一种为 Internet发展的计算机语言 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
页:
[1]