仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 892|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网站制作之COM 组件计划与使用(五)用 ATL 写第一个组件仓酷云

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:37:07 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
再说第三点:我并没有提到服务器也要整合,然后是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(...)就能够入手下手输出函数完成了:
  1. STDMETHODIMPCFun::Add(longn1,longn2,long*pVal){*pVal=n1+n2;returnS_OK;}
复制代码
这个太复杂了,不再华侈“口条”。上面我们完成字符串联接的Cat()函数:
  1. 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""""的,而函数wcscat()是以L""""作为复制停止标记,因而大概会丧失数据。分明了吗?
先生:分明,分明。我看过《COM组件计划与使用(三)之数据范例》后就分明了。那末先生,有无复杂一些的办法那?
先生:有呀,你看......
  1. STDMETHODIMPCFun::Cat(BSTRs1,BSTRs2,BSTR*pVal){CComBSTRsResult(s1);sResult.AppendBSTR(s2);*pVal=sResult.Copy();//        *pVal=sResult.Detach();returnS_OK;}
复制代码
先生:哈哈,好!利用了CComBSTR,这个就复杂多了。CComBSTR::Copy()和CComBSTR::Detach()有甚么区分?
先生:CComBSTR::Copy()会打造一个BSTR的正本,别的CComBSTR::CopyTo()也有相似功效。而CComBSTR::Detach()是使对象与外部的BSTR指针剥离,这个函数因为没有复制历程,因而速率略微快一点点。但要注重,一但剥离后,就不克不及再利用该对象啦。
先生:先生,您讲的太牛啦,我对您的仰慕如巍巍泰山,直进云霄......
先生:STOP,STOP!留功课啦......
  1、本人先依照明天讲的内容写出这个组件;
  2、不论你懂不懂,必定要往察看IDL文件,CPP文件;
  3、编译后,看都发生了些甚么文件?假如是文本的文件,就翻开看看;
  4、下载本文的示例程序(vc6.0版本)编译运转,看看效果。然后预习一下示例程序中的挪用办法;
先生:晓得啦,快下课吧,我要上茅厕,我都憋的不可了......
先生:下课!别忘了顶我的帖子呀......


6、小结

  本回先容第一个ATL组件程序的创建步骤,而怎样利用该组件,敬请存眷《COM组件计划与使用(七)》。
 注1:Apartment,体系经由过程埋没的窗口动静来列队组件挪用,因而我们能够临时不思索同步成绩。注重,是临时哈。
注2:双接口暗示在一个接口中,同时撑持自界说接口和IDispatch接口。今后,今后,今后就讲。由于双接口十分主要,我们今后会每天讲、夜夜讲、经常讲------简称“三讲”:)
注3:组件的重用办法有2个,聚合和包涵。
注4:称号的功效很难听,但微软基本就没有完成。
注5:这些都是IDL文件中的观点,今后用到甚么,就先容甚么。
原文链接:http://www.vckbase.com/document/viewdoc/?id=1497

再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。
变相怪杰 该用户已被删除
19#
发表于 2015-6-5 23:01:33 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
因胸联盟 该用户已被删除
18#
 楼主| 发表于 2015-5-7 13:32:58 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
愤怒的大鸟 该用户已被删除
17#
发表于 2015-5-1 19:09:16 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
灵魂腐蚀 该用户已被删除
16#
发表于 2015-4-24 01:10:33 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
冷月葬花魂 该用户已被删除
15#
发表于 2015-4-6 07:20:28 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
蒙在股里 该用户已被删除
14#
发表于 2015-3-31 13:16:28 | 只看该作者
是一种使用者不需花费很多时间学习的语言
老尸 该用户已被删除
13#
发表于 2015-3-24 22:34:34 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
分手快乐 该用户已被删除
12#
发表于 2015-3-21 23:43:38 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
深爱那片海 该用户已被删除
11#
发表于 2015-3-17 19:39:19 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
小女巫 该用户已被删除
10#
发表于 2015-3-17 01:39:04 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-15 22:08:10 | 只看该作者
是一种为 Internet发展的计算机语言
只想知道 该用户已被删除
8#
发表于 2015-3-10 00:40:56 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
7#
发表于 2015-3-7 09:19:54 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
简单生活 该用户已被删除
6#
发表于 2015-2-23 14:47:08 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
爱飞 该用户已被删除
5#
发表于 2015-2-10 02:58:52 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
飘灵儿 该用户已被删除
地板
发表于 2015-2-8 04:52:58 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
莫相离 该用户已被删除
板凳
发表于 2015-2-2 20:23:51 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
再现理想 该用户已被删除
沙发
发表于 2015-1-27 06:54:23 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
再见西城 该用户已被删除
楼主
发表于 2015-1-25 21:17:22 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 07:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表