当前位置:编程学习 > VB >>

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

--------------------编程问答-------------------- 前排支持!!! --------------------编程问答-------------------- 第二排支持!! --------------------编程问答-------------------- 又见老马哈哈。 --------------------编程问答-------------------- --------------------编程问答-------------------- 一直支持。。。 --------------------编程问答-------------------- VB6本身不支持继承的。所以用VB6的类的模式,是行不通的。
大破才能大立,DyCOMHelper,是从体系上,整个按照COM标准重建的。
--------------------编程问答-------------------- 谢谢大家的支持 --------------------编程问答-------------------- 下了,看了,但是:
一,没有完全看懂,水平太低。
二,有何实用意义?请指教。 --------------------编程问答-------------------- 先顶再看。实现继承就是意义 --------------------编程问答-------------------- 呵呵。意义嘛,我就不说了。实现这个东西,是我的爱好。就像我喜欢搭积木一样,喜欢搭成一个塔的样子。如果这个塔,对你有意义,我就很荣幸。
VB6的类,起步96字节的占用,固定在堆中进行分配。
初始化的速度,和释放的速度,如果做做实验就知道了。
当然,继承,VB6是不可能的。
还有很多。我陆续贴出。 --------------------编程问答-------------------- 推荐到首页了,感谢楼主分享。 --------------------编程问答-------------------- 谢谢斑竹Modest
未来我将分享更多成果。呵呵 --------------------编程问答-------------------- 好东西,大力支持! --------------------编程问答--------------------

'------------------------------------------------------------------------------------'说明:
'     1、关于属性、方法、函数的声明:
'        没有接触过COM编程的人,看到 Property Get LegsCount 被声明成函数,可能会觉得很奇怪。
'        其实,这是您习惯了VB为我们封装好的代码。其实在COM层面下,它最原始的情形就是这样的。
'        标准的COM,只有函数(Sub 其实也是函数,只是返回了Void),没有属性和方法,函数的返回值可以是任何类型。
'        而VB对类成员实现,所有成员返回值类型都是HResult,这里我们用 Long表示,该返回值用作错误处理用。
'        原理上,您可以用DyCOMHelper创建任意返回值类型的,但是,我们建议您按照VB的规范来进行。
'        方法的声明:
'        Private Function This_Sub_SubName(ByRef This As YourStruct,Args......) As Long
'        End Function
'        函数的声明:
'        Private Function This_Sub_FuncName(ByRef This As YourStruct,Args......,Ret As 类型) As Long
'        End Function
'        属性Get的声明:
'        Private Function This_PropGet_PropName(ByRef This As YourStruct,Args......,Ret As 类型) As Long
'        End Function
'        属性Let的声明:
'        Private Function This_PropLet_PropName(ByRef This As YourStruct,Args......,Newval As 类型) As Long
'        End Function
'        属性Set的声明:
'        Private Function This_PropSet_PropName(ByRef This As YourStruct,Args......,Newval As 类型) As Long
'        End Function
--------------------编程问答-------------------- 很多人可能看不明白,类成员的实现,怎么都是函数。没有属性和方法。
以上是说明。 --------------------编程问答-------------------- kan kan --------------------编程问答-------------------- --------------------编程问答--------------------
引用 15 楼 codingfunny 的回复:
很多人可能看不明白,类成员的实现,怎么都是函数。没有属性和方法。
以上是说明。

14楼的DD在Visual Basic 高级编程中看到过。 --------------------编程问答-------------------- 是的。克兰德的大作。 --------------------编程问答-------------------- aaaaaa --------------------编程问答-------------------- 比较NB的啊
--------------------编程问答-------------------- 抱歉,有段代码没有放上去。
实例中的代码,会造成内存溢出的问题。
请在 每个模块的 pClass_Terminate_X 加入以下代码,以 pClass_Terminate_Wolf 为例

    Private Sub pClass_Terminate_Wolf(ByRef This As dyWolfType)
      Dim Destroy     As dyWolfType
      This = Destroy
    End Sub

造成溢出的情况是,如果这个结构里,有指针型的变量成员:字符串、对象、不定长数组。请一定在该实例Terminate时,释放。如果这三种以外的,也就是值型变量,不需要。 --------------------编程问答-------------------- 学习 学习 --------------------编程问答-------------------- 还有人用VB6? 悲哀 --------------------编程问答-------------------- 是吧?这么烂,我们还不知道哎。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 24 楼 jinhuah 的回复:
还有人用VB6? 悲哀

大侠,我们该用什么工具呢?  --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 学习,学习!!! --------------------编程问答-------------------- --------------------编程问答-------------------- gfjhgffghjk --------------------编程问答-------------------- u6 m35iu6 7 46i67i67i67i867i --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 顶,收藏了 --------------------编程问答-------------------- --------------------编程问答-------------------- 顶。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- lz的精神是好的,

但想不到有什么理由 值得花这么大的力气去整这个未日VB6,

直接上VB.net、C# 不就行了吗?!

--------------------编程问答-------------------- VB6 只有原来的老系统继续维护才用一下它,凑合着能用就行。
--------------------编程问答-------------------- 感谢leo2003提醒。
1、爱好吧。用英文说,I like it.
2、目前我在做一款类似PPT操作风格的设计器,核心的图像处理部分尝试C#,但是速度太慢了。用VC来做,整个工作量太大了。我个人无法完成,所以取一个目前来说速度还可以的VB。 --------------------编程问答-------------------- 来来,发个FLASH

http://www.m5home.com/blog/article.asp?id=285 --------------------编程问答-------------------- 存入剪贴板
--------------------编程问答-------------------- --------------------编程问答-------------------- 楼主好牛!帮顶。。。 --------------------编程问答-------------------- 好东东。。。。。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 顶,好帖子 --------------------编程问答-------------------- 来看看 。吧  --------------------编程问答-------------------- --------------------编程问答-------------------- 顶一下 已经不关注这块了. --------------------编程问答-------------------- --------------------编程问答-------------------- 支持一下。
"http://share.j2ksys.com/TestInherit.rar"不能下载。
附带说一句,类的实例在堆中分配,要比栈上分配安全,因为函数调用结束后都会清栈的,如果其它地方引用了栈上分配的对象,而调用对象发生在清栈以后,系统将崩溃。 --------------------编程问答-------------------- --------------------编程问答-------------------- 下载不了?我用的是国外服务器。下载过的。可以上传,然后把地址贴出来呵呵。
TO 58 楼qy300:
你说的很多。栈上分配,使用的前提,就是确保函数退出前,确保释放该对象。
我在我的工程里,经常会用到函数内部初始化和释放的对象,有这样的代码:

Private Sub Test()
  Dim oP      As cPen
  Set oP = NewcPen
  ....
  Set oP = Nothing
End Sub


因而这次,就增加了对栈上分配的支持。
--------------------编程问答-------------------- 感谢分享 --------------------编程问答-------------------- 不错的帖子 --------------------编程问答--------------------
引用 60 楼 codingfunny 的回复:
下载不了?我用的是国外服务器。下载过的。可以上传,然后把地址贴出来呵呵。
TO 58 楼qy300:
你说的很多。栈上分配,使用的前提,就是确保函数退出前,确保释放该对象。
我在我的工程里,经常会用到函数内部初始化和释放的对象,有这样的代码:
VB code

Private Sub Test()
  Dim oP      As cPen
  Set oP = NewcPen
  .……

假设你的例子是这样:
Private function Test() As cPen
  Dim oP      As cPen
  Set oP = New cPen
  ....
  Test = oP
  Set oP = Nothing
End Sub
如果其它函数调用Test,oP如果分配在堆里没问题,分配在栈上就有问题。
vb6对分配在堆里的对象应该是有引用计数的。Set object = Nothing只会减少引用计数,只有引用计数为0,vb6才会释放内存,但如果对象分配在栈上,什么时候释放内存,vb6控制不了。
如果要使用分配在栈上的对象,必须确保对它的引用不会传出创建它的函数之外。如果能确认用户没有把对对象的引用传出创建它的函数之外,那么把对象分配在栈上才是安全的。 --------------------编程问答-------------------- --------------------编程问答-------------------- 如果要使用分配在栈上的对象,必须确保对它的引用不会传出创建它的函数之外。如果能确认用户没有把对对象的引用传出创建它的函数之外,那么把对象分配在栈上才是安全的错。不错 --------------------编程问答-------------------- 不错,真的不错 --------------------编程问答-------------------- 很好啊! 多多学习! --------------------编程问答--------------------
引用 63 楼 qy300 的回复:
引用 60 楼 codingfunny 的回复:

下载不了?我用的是国外服务器。下载过的。可以上传,然后把地址贴出来呵呵。
TO 58 楼qy300:
你说的很多。栈上分配,使用的前提,就是确保函数退出前,确保释放该对象。
我在我的工程里,经常会用到函数内部初始化和释放的对象,有这样的代码:
VB code

Private Sub Test()
Dim oP As cPen
……


我对你的第一次回复,第一句话。说错了。原话是“你说的很好”。
呵呵。
栈上分配对象,要确保:
1、该对象在该函数内及该函数直接调用的函数使用(间接调用不算)。
2、调用直接调用的函数,要确保该函数返回前,该对象的引用减少至调用前的RefCount.
3、在函数退出VB清栈前,确保对象的释放。
符合这三个条件就可以了。

需要说明的是:DyCOMHelper创建的对象,不是VB对象,但是可以被VB识别和等效使用,它的创建和释放,增加引用,减少引用,跟VB没有关系,是由DyCOMHelper来完成的。 --------------------编程问答-------------------- Private function Test() As cPen
  Dim oP As cPen
  Set oP = New cPen
  ....
  Test = oP
  Set oP = Nothing
End Sub

这个例子,实行在栈上分配时不行的。 --------------------编程问答-------------------- 下载链接又可以用了。
示例里,我增加了利用指针对对象Inner Data进行访问的示例。
DyCOMHelper,旨在帮助想高效创建对象,使用的程序员。
其实,我们在使用对象时,系统最大的负担不是在创建和调用上,创建的时耗在分配内存和填充内存上,这个都很快,不管是在栈还是堆,调用就是一个简单的跳转,不超过10句汇编就可以搞定,也很快。慢的是在QueryInterface、Addref\ReleaseRef函数的调用上,其中以前者为甚,但是以指针的方式进行访问,可以有效避免这些。
dim ocPen        as cPen
call gBoost.Assign(ocPen,cPenType.NewInstanceReturnPtr(1))
  (在使用Assign前请确定 置ocPen为Nothing,另外确定ocPen 为cPen型)
如果cPen实现了IGDIObject接口,并且该类仅有两个接口
我们可以用下面的语句来初始化一个cPen型的IGDIObject
dim ocPen      as IGDIObject
call gBoost.Assign(ocPen,cPenType.NewInstanceReturnPtr(1,INTERFACE_1))
  '//这样返回的是1号接口的实例(接口顺序是ZeroBase的)
以上句式将不进行任何QI,Addref\ReleaseRef.
请大家在编译VB程序时,千万不要选择P代码方式。
VB在编译为P代码和调试状态下,更会频繁调用QueryInterface,而且有些事根本就不需要的调用:
dim ocPen as cPen
set ocPen=new cpen
.....YourCode
debug.print "这跟ocPen一点关系都没有"
set ocPen=Nothing
从set ocPen=new cpen
开始每一行vb都会对ocPen进行QueryInterface,包括那句很冤枉的debug.print语句。
编译为本机代码,这些就没有了。


--------------------编程问答-------------------- 我这里可以免费提供下载空间,以示支持 --------------------编程问答-------------------- 好啊。老马。下次先传给你,你给我回个链接哈。

我们用VB创建类模块,书写类,并编译。
VB替我们做了这么2件事情
1、封装了对象的实现。这是目前DyCOMHelper大体已经做到的事情。
2、生成了类型声明。这样外部调用时菜可以方便的使用这些类。
目前我的示例中使用的类型(Animal、Wolf\DemiWolf),是声明在类型库里的,类型库是直接书写IDL然后编译出来的。
用这个框架,就很费力了。
未来,我将推出在VB中写类模块,并将其转换为类型库然后自动引用的VB插件,届时将会很方便创建DyCOMHelper对象并使用了。
估计是年后了。项目紧。没时间。 --------------------编程问答--------------------
引用 47 楼 codingfunny 的回复:
感谢leo2003提醒。
1、爱好吧。用英文说,I like it.
2、目前我在做一款类似PPT操作风格的设计器,核心的图像处理部分尝试C#,但是速度太慢了。用VC来做,整个工作量太大了。我个人无法完成,所以取一个目前来说速度还可以的VB。


支持楼主,你能赚到大把的银子,这就最能说明问题! --------------------编程问答-------------------- 老马,运行有点问题(包括 F8 跟踪):
modMain 模块中:
Public Type dygTypesType
  Animal                  As DyComHelperType.COMType   '此处就卡住了
  Wolf                    As DyComHelperType.COMType
  Demiwolf                As DyComHelperType.COMType
End Type
'提示没有 DyComHelperType 类型。
'我是启动 VB 后,按照说明将该引用的 tlb 均引用上了。
--------------------编程问答-------------------- 2个TLB文件。你说的这个在 TestInheritLib.tlb里。要引用它。 --------------------编程问答-------------------- --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 楼上的疯了吗? --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 还有人用VB6? 悲哀
使用basic的早就vb7、vb8、vb9了。语言特性与类库的进步日新月异啊
讲速度与灵活性的,都用c++了。
还有人用VB6? 真是悲哀啊!
用vb6的菜鸟们,看一下vb9的新特性吧:
http://msdn.microsoft.com/en-us/library/ms364068(VS.80).aspx
这是vb10的新特性:
http://code.msdn.microsoft.com/vb2010samples
单击 New features in Visual Basic 10链接


还有人用VB6? 程序员的悲哀啊。 --------------------编程问答-------------------- 连续发帖发布了了吧?给你个机会,再吠三次。 --------------------编程问答-------------------- 十分感谢 --------------------编程问答-------------------- To:xjstart
不客气。

To:maja362738
欢迎学术性的讨论,对挑衅性的言论非常介意。
你的言论里除了缺乏最起码的对人尊重和缺乏绅士风度外,别的都是对的。
我已经点过了。实现这个是我的爱好,分享给大家,旨在互相提高,至于VB6,是否落后,我并不关心。

--------------------编程问答-------------------- 下面,我会抽时间,定期更新示例,方便大家使用。 --------------------编程问答--------------------
引用 92 楼 codingfunny 的回复:
To:maja362738
欢迎学术性的讨论,对挑衅性的言论非常介意。
你的言论里除了缺乏最起码的对人尊重和缺乏绅士风度外,别的都是对的。
我已经点过了。实现这个是我的爱好,分享给大家,旨在互相提高,至于VB6,是否落后,我并不关心。

此人看来不曾学会尊重.

还用马甲..... --------------------编程问答-------------------- ??????????????????????? --------------------编程问答-------------------- 谁还用VB6啊,除非玩玩罢了吧 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- LSR ,在这里可以刷屏吗
补充:VB ,  COM/DCOM/COM+
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,