[已更新]DyCOMHelper--让您在VB6下实现真正意义的继承。

codingfunny 2010-11-22 12:33:08
加精
经过近2个月的Coding,终于完工了。
该库您可以免费使用,如果用作商业用途,请来Email告知我justthisone@hotmail.com
DyCOMHelper,可以让您在模块里创建对象,并使用,很多VB下不能直接实现的函数,指针访问,还有多。将陆续贴出。
本贴主要展示如何用它创建对象,如何实现继承。
在这个库的实现过程中,付出最多的是对IDispatch.Invoke的实现。

本示例旨在向您展示如何在VB6下实现真正的继承,如何使用DyCOMHelper创建类,并使用,它将带您进入VB6背后的COM世界,看看我们的类是如何运行的。
DyCOMHelper创建的对象的特点:
1、可以像VB6下定义的对象一样去使用,虽然不是VB6机制创建,但是可以被VB6当作对象来识别使用。
2、支持后期绑定,支持错误处理,支持多接口等常规应用。
3、支持真正意义上的继承,本示例将说明这一点。
4、所创建的对象是轻量对象,实例占用的起步空间更小,约VB类的1/5。
5、函数调用速度高出20% 左右
6、实例创建的速度,最大可以提高近10倍
7、释放速度,最大可以提高近100倍。(以上速度来自于极限测试数据)
8、创建模式比VB6更丰富,VB6的类实例,是在堆上进行创建的,效率很低,DyComHelper可以选择堆、堆栈是进行创建,也可从某个结构上创建,也可以用内置的定长管理器进行创建。
9、从类实例外部,访问内部数据时,支持真正意义的指针式访问。
10、使用DyCOMHelper创建类,将让您的系统支持成千上万个类,而不会担心效率问题。

读这个示例您可能会问的问题:
1、类型库,怎么来的?目前是我使用工具手动创建。未来,我将推出VB6插件,在VB6下直接书写代码生成类型库并自动引用。

使用前,请先执行下列顺序:
1、引用 Types目录下 DyCOMHelperType.tlb,TestInheritLib.tlb。
2、按F8开始逐步断点执行,看看它是如何工作的。
目录下 的 DyCallerLib.dll DyCOMHelperLib.dll是不需要注册的。其中 DyCOMHelperLib.dll 是标准Dll。

示例中,有三个类,Animal、Wolf、Demiwolf,分别是动物、狼、狼狗,狼狗继承自狼,狼继承自动物,动物派生自IDispatch。
下载地址为:http://share.j2ksys.com/TestInherit.rar

-------------------俺是羞涩且低调的分割线-----------------------

由于疏忽,之前的示例,有一个库没有Include进来,向参与测试的人说声抱歉。
让我慨叹的是,这个帖子,有很多人顶了,也有很多人批评了,鼓励和批评的人中,真正拿代码Run的人,却极少极少。

感谢老马提供的空间存放DEMO,示例下载地址:

http://www.m5home.com/blog/article.asp?id=531
版权声明:
您可以在您自己的代码中免费使用该框架,如果用作商业用途,请联系作者:
QQ:63298118
MSN:justthisone@hotmail.com


注意事项:
1、如果您下载过之前的示例,请运行文件夹下的 类型库注册注销.exe,将之前的两个类型库文件进行注销。否则新版的类型库将无法引用。切记切记。
2、如果您是第一次接触该示例。请打开工程后,引用Types目录下的两个Tlb文件。
3、DyCallerLib.dll和DyCOMHelperLib.Dll是标准DLL。不需要引用。

关于DyCOMHelper:
DyCOMHelper 提供一系列的功能,遵循一些使用原则,让您可以用VB6创建运行更快的应用程序。
比如:创建轻量对象、指针访问、代码注册注销ActiveX、Tlb类型库、不引用一个Dll使用其中的对象等。
这次,仅仅说明其创建轻量对象方面的特点
DyCOMHelper创建的对象的特点:
1、类写在Moudle(.bas)中 ,而不是Class Moudle(.cls)中
2、类型定义在TypeLib中。
3、可以像VB6下定义的对象一样去使用,虽然不是VB6机制创建,但是可以被VB6当作对象来识别使用。
4、支持后期绑定IDispatch,支持错误处理,支持多接口等常规应用。
5、支持真正意义上的继承,本示例将说明这一点。
6、所创建的对象是轻量对象,实例占用的起步空间更小,约VB类的1/5(后者为96字节起步空间)
7、函数调用速度最大高出一倍左右
8、实例创建的速度,最大可以提高近5-10倍
9、释放速度,最大可以提高近100倍。(以上速度来自于极限测试数据)
10、创建模式比VB6更丰富,VB6的类实例,是在堆上进行创建的,效率很低,DyComHelper可以选择堆、堆栈是进行创建,也可以从某个结构上创建,也可以用内置的定长管理器 行创建。
11、从类实例外部,访问内部数据时,支持真正意义的指针式访问。
10、使用DyCOMHelper创建类,将让您的系统支持成千上万个类,而不会担心效率问题。

读这个示例您可能会问的问题:
1、类型库,怎么来的?目前是我使用工具手动创建。未来,我将推出VB6插件,在VB6下直接书写代码生成类型库并自动引用。

示例中,有三个类,Animal、Wolf、Demiwolf,分别是动物、狼、狼狗,狼狗继承自狼,狼继承自动物,动物派生自IDispatch。
...全文
3827 150 打赏 收藏 转发到动态 举报
写回复
用AI写文章
150 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2011-04-11
  • 打赏
  • 举报
回复
哈哈,这样好.

用来做绘图类程序就非常好了!!

喜欢轻量的东西的高效.

到时做个东西出来玩玩
codingfunny 2011-04-10
  • 打赏
  • 举报
回复
用DyCOMHelper来写类库,还有一个大的便利,就是版本的兼容性的便利,这是类型库和ActiveX的本质区别造成的。
使用类型库定义类,然后用DyCOMHelper来实现类,不用考虑版本兼容的问题。
ActiveX,在注册时,是每个类,都在注册表中注册,版本兼容方面,编译器会检查类本身的兼容性,另外还会检查类的成员及其参数,跟之前版本的兼容性,.NET类库也类似。
使用类型库,来实现类,不存在这些问题。




codingfunny 2011-04-10
  • 打赏
  • 举报
回复
效率提高的原理,我就不提了。以前有过若干论述。
DyCOMHelper,作为从底层凭空而建的体系,就可以有很多的扩充。
比如月中旬这个版本。
会带类型库定义和输出的功能,定义好一个TypeLib,填充好你要的枚举、结构、接口,就可以Save成一个Tlb文件。
另外,你也可以选择类的自动实现功能,针对一些属性多的类,非常有效,比如老马提到的他的程序里的点、多边形等类就属于这类。比如一个类Cat,有20个属性,有字符型,有Long型,用DyCOMHelper定义好类型库后,在程序里,只需要针对Cat生成一个COMType,指明自动实现属性,一行代码,该类就被实现了。不需要写额外的代码。
这样,你的程序里,这样的类再多,只是多了个类型库,而没有多代码,程序体积会小很多,同样的应用,如果你选择用VB写这些类的实现,多了若干个(超过一个)类型库(有谁知道原因?呵呵),另外程序体积会增大。

自动实现的类,还可以选择是否自动实现串行化、反串行化。
自动实现的类,还可以选择是否支持对其修改支持撤销和重做。提供一个东东叫UnDoReDoListener。可以批量检测若干实例的修改,每次监听,可以作为一次操作,若干次操作之间,可以进行撤销和重做。
自动实现的类,还支持你扩充你需要的接口,如果这个类带函数或方法,你可以去专门为它写实现。

针对管理系统开发人员,在未来版本中,会支持类实例自动转换为SQL操作语句。

我见过很多代码生成器,大多是根据类结构自动生成SQL操作语句,要么是根据数据库结构,自动生成类的实现代码。我的方案,类似这类工具的作用。但是,代码被自动实现了。一套是“有”的方案,一套是“无”的方案。哪个高呢?

codingfunny 2011-04-10
  • 打赏
  • 举报
回复
我做这个东东。就是为了解决效率低的问题的。
举个例子,类的串行化和反串行化。以前的代码,是针对普通VB类的。效率很低。
COM下的类,本身是个好东西。但是很多的调用,牵扯到了大量的AddRef、ReleaseRef\QueryInterface.
这些都是隐藏在背后运行的,比如Is语句,就可能会导致一次QueryInterface,有QueryInterface就必然有一次AddREf和ReleaseRef。
DyCOMHelper下,针对它创建的类的串行化、反串行化,我用的是指针,效率大大提高。
以前,3W个对象实例从文件里读出来,慢得出奇,现在用轻量对象+指针。速度提高了很多。
codingfunny 2011-04-07
  • 打赏
  • 举报
回复
这次升级,除了类的自动实现外,还可以为类增加UnDo/Redo的功能。都是自动实现的。
这个,如果你做过带撤销重做功能的东东,你就会懂得。
codingfunny 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 138 楼 myjian 的回复:]
引用 136 楼 codingfunny 的回复:
呵呵。我在PSC上前后发了两篇,第一篇,反响不错,后来被我删了,这个链接反响平平。
如果有人愿意开发生成TLB的插件,我提供VB Code解析到IDL的代码。
实在没时间搞这个插件。

我用过一个VB6类库生成工具,就是将VB6的API声明转换为ODL语法,然后再调用MkTypLib.exe完成的

不过电脑过年时丢了啥都没了...……
[/Quote]

那个示例,你给我过的,太简单了。:)
另外MkTypLib。编译Odl的实收,如果有类相互引用的时候,就会编译不通过。
比如A的某个成员引用了B,B的某个成员又引用了A,就编译不通过。
嗷嗷叫的老马 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 144 楼 codingfunny 的回复:]
估计月中旬可以放上来
[/Quote]
期待着,嘿嘿.

不知道大量实例化对象时的效率怎么样?

比如我做一个绘图程序,有1W个对象,包括线段啊圆啊点啊多边形啊啥的,运行效率与VB自带功能相比理论上会如何?
codingfunny 2011-04-07
  • 打赏
  • 举报
回复
估计月中旬可以放上来
孤独剑_LPZ 2011-03-31
  • 打赏
  • 举报
回复
same[Quote=引用 140 楼 ameken 的回复:]
留脚印,有时间再研究
[/Quote]
Dision LI 2011-03-31
  • 打赏
  • 举报
回复
留脚印,有时间再研究
嗷嗷叫的老马 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 137 楼 codingfunny 的回复:]
增加了类的串行化和反串行化的支持[/Quote]
这个我喜欢,VB6里对象是不能复制的,只能手工处理数据.

有了这个功能后,就可以复制对象了.

新版出来后我更新到我的站里,哈哈.
嗷嗷叫的老马 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 136 楼 codingfunny 的回复:]
呵呵。我在PSC上前后发了两篇,第一篇,反响不错,后来被我删了,这个链接反响平平。
如果有人愿意开发生成TLB的插件,我提供VB Code解析到IDL的代码。
实在没时间搞这个插件。
[/Quote]
我用过一个VB6类库生成工具,就是将VB6的API声明转换为ODL语法,然后再调用MkTypLib.exe完成的

不过电脑过年时丢了啥都没了.......现在下载也下载不到了,HOHO.

我觉得你这里也可以调用这个工具,省点事.
codingfunny 2011-03-31
  • 打赏
  • 举报
回复
新版马上出来了。是ActiveX版本的。以前标准Dll版,总是会造成VbRunningTime的一个错误。
新版的变化:
1、增加了类的串行化和反串行化的支持。这下,想处理数据存储的朋友有福了。
即支持对DyCOMHelper创建的类,也支持普通类。
2、增加对数据处理类的支持,自动生成SQL操作语句。
比如有些类,我们只是用来从数据库读出数据,暂存,使用然后向数据库里写入数据 。就这些子个功能。
现在用DyCOMHelper,处理就非常容易了,类型库里定义好接口,在生成类型COMType时配置好各Field的数据类型。类的实现就自动完成了。
codingfunny 2011-02-16
  • 打赏
  • 举报
回复
呵呵。我在PSC上前后发了两篇,第一篇,反响不错,后来被我删了,这个链接反响平平。
如果有人愿意开发生成TLB的插件,我提供VB Code解析到IDL的代码。
实在没时间搞这个插件。
zzyong00 2011-02-15
  • 打赏
  • 举报
回复
发现PSC上很不错啊,全世界VB6粉丝都会高兴的,不过,有一条评论挺有意思:Too late, but TOO COOL.
codingfunny 2011-02-15
  • 打赏
  • 举报
回复
PSC上的地址是 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=73678&lngWId=1
最新更新将发布在这个地址上。
mokton 2011-01-26
  • 打赏
  • 举报
回复
这个继承不继承还不太懂,下了代码,就先顶吧!
嗷嗷叫的老马 2010-12-08
  • 打赏
  • 举报
回复
楼上很久不见

貌似我被删除了一个帖子
lingll 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 122 楼 codingfunny 的回复:]
总有人在用一些很怪的逻辑:越是用新进出来的语言和工具,就越自以为是高手。
高手如果是这么炼就的,这可真是一条不错的捷径啊。
牛的也许是工具,你可不牛。
国外的论坛看多了,用这种逻辑自我标榜的人,不多见。
[/Quote]

支持,那些只是工具而已
lingll 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 codingfunny 的回复:]
感谢leo2003提醒。
1、爱好吧。用英文说,I like it.
2、目前我在做一款类似PPT操作风格的设计器,核心的图像处理部分尝试C#,但是速度太慢了。用VC来做,整个工作量太大了。我个人无法完成,所以取一个目前来说速度还可以的VB。
[/Quote]

支持楼主,爱好就足够了
加载更多回复(102)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧