关于vb6 Class

VB6 的类对象变量,其实是一个结构体的指针,而这个结构体的第一个元素又是一个虚表的指针。

可以用下图表示:

 

如: dim x as Object

         Object       VTable

[x]--> |pVTable|--->|   QI              |

       | .其它 |    | AddRef            |

                    | Release           |

                   GetTypeInfoCount  |

                    | GetTypeInfo       |

                    | GetIDsOfNames     |

                    | Invoke            |

                    | 真正自已的方法    |

 

x其实长度只有4个字节,它的值是一个地址。

所以 varptr(x) 是求的x的地址,objptr(x)是求的x的值.

 

下面是一个趣味练习

'--mdlMain--start

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub main()
    Dim x As Class1
    Set x = New Class1


    Dim pVTable As Long
    Debug.Print ObjPtr(x)
    CopyMemory pVTable, ByVal ObjPtr(x), 4
    CopyMemory ByVal pVTable + 7 * 4, FunPtr(AddressOf MeMsg), 4
    
    x.Msg  '倒底显示什么信息呢。
   
End Sub

Private Function FunPtr(f As Long) As Long
    FunPtr = f
End Function

Private Sub MeMsg()
    MsgBox "可能吗"
End Sub

'----mdlMain--end

 

’-----class1 code

Public Sub Msg()
    MsgBox "hello"
End Sub

 

后记:

1但是这样其实是有一个问题的。因为类方法其实有一个this隐含参数的,所以最好最在MeMsg 加一个长整数参数,

2 其实这也给vb6实现复盖或继承类方法提供了一种思路,只要你先把要复盖的类的vTable,复制到自已定义的VTable中,然后把自已的pVTable指向这个新VTable
 

 

posted on 2010-04-18 21:10  杨志农  阅读(353)  评论(0)    收藏  举报

导航