捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:Delphi AOP(Aspect Oriented Programming) Frame - MeAOP v0.5
yeeler 28047 2007/2/10 9:02:27
说了这么多 演示代码是干嘛的啊,我是菜鸟, 学习中....... 惭愧
wu_yanan2003 23971 2006/5/30 10:02:19
   谢谢指教。
riceball 23908 2006/5/26 16:38:38
to ralf
  唉,Delphi 的开发小组没有发挥它们的效力,可能和Borland公司管理层有关,所以要想能有高效(高速,占用内存下)的类库,只有自己写咯。
  也是因此FastCode, FastMM,FastObj等等一系列为底层提速的Library才被Delphi Fans开发出来。这些本来应该是Delphi Team的工作。
  举着MDA的大旗,就不管效率了?MDA(模型驱动技术)只是辅助生成源代码的手段而已。它再怎么牛,最终还是落实到底层类库上。
  说起类的Model架构,就是气,看看后来Delphi Team写的WebService,一来就是Interface,SOAP,XML!它倒是一下满足需求了,可它也就只能干这个!
  能卸能装,才是一个好的架构,就像工厂的车间生产标准化的零件,将不同的零件装配起来,就能够实现不同的功能。每个零件都能独立出来,
  另作它用,这才是Delphi的精髓。
  Delphi 的MDA我没有用过,我觉得MM就很好用,但是它的缺点就是不支持Object和条件编译令人烦恼。
  我依稀记得 RemObjects 就是写了一个工具,用来自动生成远程方法的源代码。看得我想吐。

to wu_yanan
  对,我在0.50版本用的就是这个技术手段:
    1、保存方法的入口代码(5字节)
    2、修改函数方法的入口代码为跳转到我的方法入口
    3、执行我自己的处理
    4、恢复原来方法的入口代码
    5、执行原始的方法
    7、再次修改函数方法的入口代码为跳转到我的方法入口
  这种方式的缺陷就是无法支持多线程,因为拦截的过程根本无法重入!
  所以在0.53版本我想到预先打洞的方式,来解决这个问题。
  后来我又在0.54版本想到(就是这个周)一招,嘿嘿,不用打洞,也能重入了!!这下全部搞定!不过,注入器的大小增加到了64个字节,
  幸好还是比TObject类占用的空间少(TObject至少占用了76个字节VMT)。
  
  抱歉,我基本上很少上qq,除非是工作上的原因,时间紧阿。
  有什么需要问的就问吧。对我来说技术不是问题,难的只是架构!

  O/R map: 是数据库记录和对象的映射,开发BO对象我也有这个打算,我目前用的InstantObjects。
  通信协议:我从来没有想过开发这个玩意,我只要我的零件能勾挂上我想用的通信协议类库就可以了(RealThinClientSDK, synapse, indy[越开发越忘记它的初衷被我枪毙了])
  安全性:我已经有了一个非常棒的Cipher 类库,我在此基础上开发了非对称加密算法RSA。
  元数据代码生成工具: 似乎没有这个必要,不过在未来漫长的日子,也许我会考虑编写一个针对EXE文件的工具:用于静态编织(weave).
  客户端UI自动生成功能:这个我从2004年开始就在构思中,但是还是我觉得我的构思还不是很完美,架构始终是最烦人的。Delphi RTTI信息太弱了!大部分都要靠自己。
  Spring的框架: 你指的是哪一部分? Core(Bean Container)? AOP? ORM? DAO? Web? MVC? 它真就有这么好么?它的缺点和短处你都明白了?
wu_yanan2003 23898 2006/5/26 12:54:17
    http://www.delphibbs.com/keylife/iblog_show.asp?xid=22250
基本原理,附简单代码实现。要想达到riceball 的实用程度,还需修改。
wu_yanan2003 23879 2006/5/25 21:06:34
    加我聊聊吧,riceball。我专门研究网络,系统底层,和三层技术。
    QQ:11718111, 注明:riceball
    我掌握类似的技术及代码。最近准备用这个原理做一个AOP框架。目的是想实现DELPHI下三层真正技术。功能如下:
    1.支持o/pmaping映射。
    2.安全性,与业务无关的多种底层通信协议(http, tcp, udp等)
    3.元数据代码生成工具。
    4.远程调用采用动态代理技术,AOP技术。
    5.类似于spring的框架简单实现。
    6.客户端UI自动生成功能。
    等等,如果有兴趣。呵呵。加我吧。
ralf_jones 23829 2006/5/24 11:16:24
DELPHI现在走在MDA的路上,可能不会去特别打AOP和GP的大旗了.而且一般也会将MDA和AOP归到GP的下面,那么有MDA也就可以了,基本上都是基于代码生成的OO技术. 不知道为什么要骂人啊? 唉...
zbird 23754 2006/5/21 0:45:28
把程序放到这种地方,被人要源码是很正常的,没人要才不正常:)(除非是没人要的东西)。
多数要源码的也主要是赶新鲜,想看一下源码长得是个啥样子而已,没几个人会去认真研究的。
我一直都觉得如果需要语言需要hack,一种可能是这些东西是不赞成使用的,要不就是工具开发商的事了。
希望delphi以后能官方支持aop,不过我觉得可能性不大。
skywolf888 23751 2006/5/20 22:40:43
再补充一句,我是研究三层数据库和网络的,如果三层数据库的服务器端执行的效率,整体稳定性个方面可以通过的话,卖钱也是不错的,呵呵,我愿意以asta和remobjects sdk为你做测试,提供测试环境,呵呵
skywolf888 23750 2006/5/20 22:35:58
忘了说了,如果你也是调用系统级的api自己写类封装了的话,公开也是无妨,愿意研究和你交流的自然会找你,下了源码扔在那睡觉的仍然继续睡觉,呵呵
skywolf888 23749 2006/5/20 22:33:40
牛人,研究AFXRootkit2005我想可以达到同样的效果,系统级的api应该会比你写的效率多少高一些吧
chinapr 23747 2006/5/20 17:52:55
卖东东就卖东东嘛!何必把自己说得那么高尚去贬低别人呢?
做人要厚道
jhwh 23742 2006/5/20 14:34:14
to jhwh
 玄,你说的这些让学生我云里雾里的,完全不懂也,GP高人阿,俺饭桶是笨人一个,看不懂那些所谓的pointcut,aspect以及weave code, 这位高人,你就慢慢捣腾GP吧,就不用在这里跟饭桶一般见识了吧。

不过,我还是要提醒你下,AOP的确不是什么AfterExcute这样的东西,它只是一种编程的方法论,目的是为重用功能。
而AfterExcute只是我对AOP编程方法论的一种具体实现!当然你完全可以用其他的方法来实现它!
----------
这样说话很可笑,也比较傻。你连我的贴子都看不懂,确实不值得和你见识。然而看着你还用着AfterExecute这样的方式,顶着Aop这样的概念,很怕给你误导了。准确点说,你连OO设计都没搞明白。当然了,既然你也认为你是饭桶,没明白OO也正常,GP对你来说,确实难得没有边了,哪里还有资格来谈。嘘都懒得嘘你了。
笨点没关系,人品有问题就麻烦了。
一方面叫嚷着BS着想看看代码的朋友,一边又说“如果你们在这方面造诣深厚,能指教于我,那我二话不说,奉上源码不说,还要恭恭敬敬的奉上。”。看看这付嘴脸,一方面想别人免费给他指教,一方面又要收费,真的是做着婊子立牌坊。我想象不出,hallvard Vassbotn 们会来看连我都看不上眼的东西。

顺便和大家交流一下,谈谈我的一些看法。
为了好说,大体把软件分为应用和系统两种。两种类型没有什么高低之分,难的地方不一样。
从应用软件来看,难的是建模。对各种企业逻辑,很难组织一个通用的模型,然后对它进行设计,现在有的比较公认的模型就是工作流,但是也有几个版本。从系统软件来看,难的是计算机学:各种算法,设备本身的各种特性。
但是,这些都不包括什么汇编这样的”让人看不懂“的东西。开口闭口就说asm,其实就是告诉我们,半罐水来了。register,stdcall,这样的约定,如果让我特意拿出来现,我觉得简直就是丢自己的脸。从语言角度,我以为从简单到困难的排列方式是:to jhwh
 玄,你说的这些让学生我云里雾里的,完全不懂也,GP高人阿,俺饭桶是笨人一个,看不懂那些所谓的pointcut,aspect以及weave code, 这位高人,你就慢慢捣腾GP吧,就不用在这里跟饭桶一般见识了吧。

不过,我还是要提醒你下,AOP的确不是什么AfterExcute这样的东西,它只是一种编程的方法论,目的是为重用功能。
而AfterExcute只是我对AOP编程方法论的一种具体实现!当然你完全可以用其他的方法来实现它!
----------
这样说话很可笑,也比较傻。你连我的贴子都看不懂,确实不值得和你见识。然而看着你还用着AfterExecute这样的方式,顶着Aop这样的概念,很怕给你误导了。准确点说,你连OO设计都没搞明白。当然了,既然你也认为你是饭桶,没明白OO也正常,GP对你来说,确实难得没有边了,哪里还有资格来谈。嘘都懒得嘘你了。
笨点没关系,人品有问题就麻烦了。
一方面叫嚷着BS着想看看代码的朋友,一边又说“如果你们在这方面造诣深厚,能指教于我,那我二话不说,奉上源码不说,还要恭恭敬敬的奉上。”。看看这付嘴脸,一方面想别人免费给他指教,一方面又要收费,真的是做着婊子立牌坊。你又为FastCode做了什么?你为什么要它的源代码?我想象不出,hallvard Vassbotn 们会来看连我都看不上眼的东西。

顺便和大家交流一下,谈谈我的一些看法。
为了好说,大体把软件分为应用和系统两种。两种类型没有什么高低之分,难的地方不一样。从应用软件来看,难的是建模。对各种企业逻辑,很难组织一个通用的模型,然后对它进行设计,现在有的比较公认的模型就是工作流,但是也有几个版本。从系统软件来看,难的是计算机学:各种算法,设备本身的各种特性。
但是,这些都不包括什么汇编这样的”让人看不懂“的东西。开口闭口就说asm,其实就是告诉我们,半罐水来了。register,stdcall,这样的约定,如果让我特意拿出来现,我觉得简直就是丢自己的脸。从语言角度,我以为从简单到困难的排列方式是:stucted,asm,oo,gp。structed方式,和我们直觉思维方式相似,有一个顺序;asm很繁琐,同时要考虑机器的思维,但是也是顺序思维,也就那么回事,没什么难;oo,用类表达概念,显然和前两种语言的思考是完全不一样的了,需要在思维上来个转变。如果还一味的在里面加AfterXXX的方式,也就退回到顺序执行了。这个方式,就有点goto语句一样,直观,但是容易混乱。TDataSet的AfterXXX,我想大家是维护得头疼了把。在一个企业逻辑中,它人为的把企业逻辑给分成了计算机运行片断,当然要避免。所以,我们设计,是要做全面考察的,不要做一个能用的东西就好,否则有得你头疼的时候。我们看看AOP,它的目标是横向跨越几个操作,这个显然和顺序执行是正交的,如果还采用AfterXXX这样的方式,虽然能实现想要的功能,显然有点南辕北辙的味道。所以,我说这个应该交给语言本身来实现。这时候,完全可以看看采用GP怎样做了。GP,名字就是泛型,显然的告诉我们,考虑一个概念,不管具体。而用OO,一写下这个类,就完全确定这个东西了。OO提倡的是一个家族树,而GP提倡的是相似概念的横相层次。当然,interface也是相似的,但是interface只考虑操作,而GP考虑全部。这么看,GP天生就是用来做正交设计的,AOP就是一个正交的例子,用GP来做,很合适。采用GP,能知道对哪些需要的class进行组合,好维护,但是也就变得不灵活;如果是语言本身解决这个问题,确实可以做到对任意一个class进行操作,确实使用简单,但是如果代码组织不好,维护性也就差。

如果各位需要看AOP的代码,上SourceForge,搜索Aspect,AOP到处都是,包括Delphi的。
yzdbs 23740 2006/5/20 13:25:36
>>to 那些叫嚷要源码的
>>互联网上源程序你们下了不少吧,但是你们又看了多少,收获了多少?
>>你们多少懂嵌入汇编,8086二进代码?知道什么是register,stdcall调用约定?
>>悲哀啊,不知道学习探讨技术,就知道一天到晚源码源码的叫,就算给
>>你们,你们能看懂么?再说了,俺们写点东西,就容易么,放出来免费用
>>还不知足,如果你们在这方面造诣深厚,能指教于我,那我二话不说,
>>奉上源码不说,还要恭恭敬敬的奉上。如果是 hallvard Vassbotn 以及 FastCode
>>的作者有这个需要的话,那我肯定是二话不说,立马奉上。你们,做了
>>些什么有益于这个项目的事情呢?俗话说,无功不受禄阿!

同意呵。。。  :-)
wu_yanan2003 23734 2006/5/20 10:00:17
    呵呵,佩服。
riceball 23723 2006/5/19 17:32:36
to all
这不是什么可以拿来玩的玩具(控件),这是我所实现的Delphi AOP SDK!
在我看来,它好比是核弹,虽然威力巨大,但是如果不会操作,那你(的程序)怎么死的都不知道!

如果你不懂OO编程,不知道调用约定,不懂得线程,最好别玩这个。

鉴于一个礼拜过去了,我没有看到一点关于我的AOP反馈信息:错误报告,应用等等。
所以无源码的新版本就不对外公布了,只有那些给了我有价值反馈信息,才有资格免费
获得新版本。

注意[0.5.2.0]:
  !* 只支持register调用约定(Delphi的默认调用约定)的无参数函数
  !* 不支持多线程(拦截的过程方法)
  !* 不支持拦截构造方法(Constructors)和析构方法(Destructors)
  !* 过程体内容必须不小于5个字节(因为我的注入代码为5字节)
  
版本历史:
Ver 0.5.2.0
  + 无参数的函数返回值现在支持任何类型了!
  * [Bug] minor bug fixed.

Ver 0.5.1.0
  + 支持无参数函数
  + 支持拦截在DLL中的函数和方法
  * [Bug] minor bug fixed.

Ver 0.5.0.0 [Released]
  + First Released.
  + intercept the procedure and method with no parameters.

我目前的开发计划 milestone:
Ver 0.6 -  定义类型的 RTTI 信息类,以及相应的管理函数。
          基本类型信息,过程参数信息,管理用户自定义类型
Ver 0.7 -  支持带参数的过程方法,但是不可以修改任何参数。(针对 Register 调用约定)
          支持对 Constructor 和 Destructor 方法的拦截。
Ver 0.8 -  支持带参数的过程方法,可以修改参数值(包括函数返回值)。
          如果是在执行前拦截,这样就可以实现对参数值的约束。
          如果是在执行后拦截,则就可以实现对返回值的约束。
          这是一把双刃剑,如果滥用的话,就等于是对过程的劫持。
Ver 0.9 -  支持虚方法和动态方法的重入——多线程支持
Ver 1.0 -  对面向功能类(TMeCustomFeature)制定开发规范
          规范:拦截的方法必须是发布的动态(dynamic)或虚方法,并且该方法名称不得以"_"或小写字母"i"打头.
          如果方法是带参数的活函数,那么必须注册其过程类型!
          能够一次性添加某类中符合规范的方法。
          支持 stdcall 调用约定的过程或方法
          支持 pascal 调用约定的过程或方法


to wu_yanan2003
如果你说的Hook API 是直接修改内存的DLL的函数入口地址,那么这就是我所用的技术!
如果你说的Hook API 是基于SetWindowsHook 之类的话,那就不是!

就是因为WebService这样的实现,太慢,太高层,太庞大,我才会弄这个的。我这个跟WebService
完全是两个不同层次上面的!!它是基于类的重新包裹(动态代理)。而我是底层汇编二进制机器代码
的直接拦截注入。

在我的[Ver 0.5.1.0]已经支持对DLL(BPL)中的过程或方法进行拦截了。嘿嘿,如果加上对进程的远程注入,
后面的话,我就不说了。当然这个要等我实现过程参数才变得真正意义。不过,我不希望我的东西
被滥用。一把剑,放在侠客的手里,自然可以行侠仗义,但是落入居心叵测的人手里,那就麻烦了。



to swnh
被你猜中了,等1.0版本出来,无源码的也是要money的。不过现在的0.5版本可以免费使用。
无源码的大约 $400
有源码的大约 $900

也许考虑现在就卖 $200($400有源码的),这个时候买的,免费升级到1.0。
然后每升级到一个新版本就增加点钱。

to jhwh
 玄,你说的这些让学生我云里雾里的,完全不懂也,GP高人阿,俺饭桶是笨人一个,看不懂那些所谓的pointcut,aspect以及weave code, 这位高人,你就慢慢捣腾GP吧,就不用在这里跟饭桶一般见识了吧。

不过,我还是要提醒你下,AOP的确不是什么AfterExcute这样的东西,它只是一种编程的方法论,目的是为重用功能。
而AfterExcute只是我对AOP编程方法论的一种具体实现!当然你完全可以用其他的方法来实现它!


to 那些叫嚷要源码的
互联网上源程序你们下了不少吧,但是你们又看了多少,收获了多少?
你们多少懂嵌入汇编,8086二进代码?知道什么是register,stdcall调用约定?
悲哀啊,不知道学习探讨技术,就知道一天到晚源码源码的叫,就算给
你们,你们能看懂么?再说了,俺们写点东西,就容易么,放出来免费用
还不知足,如果你们在这方面造诣深厚,能指教于我,那我二话不说,
奉上源码不说,还要恭恭敬敬的奉上。如果是 hallvard Vassbotn 以及 FastCode
的作者有这个需要的话,那我肯定是二话不说,立马奉上。你们,做了
些什么有益于这个项目的事情呢?俗话说,无功不受禄阿!
chinapr 23659 2006/5/17 10:04:45
不知道作者能不能把源码全部公开呢?


十万感谢
chinapr 23657 2006/5/17 9:58:58
源码不完整。关健部份没有源码呀!!!!
jhwh 23645 2006/5/16 19:44:12
如果AOP就是AfterExcute这样的东西,不用也罢。想想TDataSet的一堆AfterXXX,beforeXXX,多么难以维护。何况AOP不是这样的东西。即使算上拦截,这样的方式,闹着玩还可以,想用到开发中,只有死路一条。AOP本来是语言要解决的东西,既然没有,还不如自己做一个类库。oo固有的缺点,就是只能考虑家族树。可惜Delphi没有GP。用GP基本能解决AOP想要做的事情,不过比语言提供的解决方案要负责,但是维护要好得多。网上可以找到c++,java,c#的AOP解决方案。
wu_yanan2003 23633 2006/5/16 11:14:07
    猛禽的我已经研究过了,最近在研究API函数的截获。这个也可以实现AOP,可能和楼主的代码原理差不多。
zbird 23620 2006/5/15 20:41:53
WEBSERVICE代码太多而且夹杂着汇编看得头晕(估计这个代码里也应该是有夹汇编的)。
Delphi动态代理的实现 猛禽 已经实现了,上次问他要了代码,不过还没太看。
第一页 上一页 下一页 最后页 有 26 条纪录 共2页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表