欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
在CSDN的一个帖子( 求高效的取高字节VB6的函数 )里见到问题,说是想要高效的方式取得一个Long的高低字.

原帖子里用计算的方式来得到高字值,但还想要再快.

于是我就想到了C里面的联合体union,要是VB6里有这玩意该多好,直接赋值就能取高低字....

不过想想以前好象写过这玩意,就翻了一下之前写的一个与单片机通讯的代码,里面也有用到这功能,于是整理一下吧lol.gif

以下代码,新建一个EXE工程,再拖个按钮,复制进去就可以了.

Option Explicit
'仿C语言中的联合体union高效取高低字方法
'
'实现思路:
'通过操作SafeArray来使一个数组的pvData指向目标变量,然后直接访问高低字,就像C里面的union一样
'
'By 嗷嗷叫的老马
'http://www.m5home.com/

Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
     ByRef Destination As Any, _
     ByRef Source As Any, _
     ByVal Length As Long)

Dim myIntegerArr() As Integer, myLong As Long
Dim ppSA As Long, pSA As Long, pvDataOld As Long

Private Sub Command1_Click()
    myLong = &HAABBCCDD     '赋值.此变量已与数组"绑定"了.
    
    MsgBox Hex(myIntegerArr(0)) & vbCrLf & Hex(myIntegerArr(1))     '直接取得高低字
End Sub

Private Sub Form_Load()
    Call initArray
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call FreeArray
End Sub

Private Sub initArray()
    '初始化数组及指针.
    '
    '将SafeArray结构的pvDara指针改为myLong变量的地址,这样就可以直接访问高低字了.
    '
    '简单来说就是"绑定"数组与myLong变量,让它们实际上使用同一个地址,相当于C里面的union
    '
    ReDim myIntegerArr(1)                           '与要访问的变量的长度相同.这里是要把Long分成两个Integer来访问,那就是0,1两个成员.
    myLong = VarPtr(myLong)                         '把自己的地址放在自己里面
    
    ppSA = VarPtrArray(myIntegerArr)                '得到指向SafeArray结构指针的指针(有点绕,就是指针的指针...- -!!)
    Call CopyMemory(pSA, ByVal ppSA, 4)             '得到SafeArray指针
    
    MsgBox "pSA=" & Hex(pSA)
    
    Call CopyMemory(pvDataOld, ByVal pSA + 12, 4)   '保存之前真数组的指针
    Call CopyMemory(ByVal pSA + 12, myLong, 4)      '设置myLong的指针为真数组指针
End Sub

Private Sub FreeArray()
    '恢复原来申请的真数组指针,并释放数组
    '
    Call CopyMemory(ByVal pSA + 12, pvDataOld, 4)   '恢复myLong的指针为之前申请的真数组指针
    Erase myIntegerArr()
End Sub
3 条评论
# 1: CWOOD said:
2013-03-28 15:35:48
办法真不错!
换新单反了吗?
# 2: Cavalier said:
2013-03-30 01:58:27
老马前辈,无意中在csdn看到你的旧博客顺藤摸瓜的过来的,我是新学编程的菜鸟,一点基础都没有,可以请教下你一开始怎么学编程好吗,我是打算从VB开始学,现在下载了VB2010来实践,这样可以么?顺便想请你推荐基本编程入门的书,感激不尽!!
# 3: 嗷嗷叫的老马 said:
2013-03-30 21:52:13
TO CWOOD:
这个办法还不是最快的,最快的是那个帖子中的算法方案.

TO Cavalier:
VB这个语言其实入门算是最容易的了,其实网上有非常多的热心网友做了教程的,使用谷歌搜索就可以找到,不建议百度,容易出来大量无用的内容,降低搜索效率.
另外,如果是为了以后的工作而学习编程技术,建议学习C#,入门难度也是不高的,但是综合能力是非常好的,我最近也在打算学学呢:)
PS:书方面由于我自己看过的不多,所以没办法给你推荐,不好意思!
添加评论

昵称 *

E-mail