欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
在CSDN的一个帖子( 求高效的取高字节VB6的函数 )里见到问题,说是想要高效的方式取得一个Long的高低字.
原帖子里用计算的方式来得到高字值,但还想要再快.
于是我就想到了C里面的联合体union,要是VB6里有这玩意该多好,直接赋值就能取高低字....
不过想想以前好象写过这玩意,就翻了一下之前写的一个与单片机通讯的代码,里面也有用到这功能,于是整理一下吧
以下代码,新建一个EXE工程,再拖个按钮,复制进去就可以了.
原帖子里用计算的方式来得到高字值,但还想要再快.
于是我就想到了C里面的联合体union,要是VB6里有这玩意该多好,直接赋值就能取高低字....
不过想想以前好象写过这玩意,就翻了一下之前写的一个与单片机通讯的代码,里面也有用到这功能,于是整理一下吧

以下代码,新建一个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
'仿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
添加评论
GB2312 https://www.m5home.com/blog/trackback.php?id=46&encode=gb2312
UTF-8 https://www.m5home.com/blog/trackback.php?id=46&encode=utf-8
换新单反了吗?
这个办法还不是最快的,最快的是那个帖子中的算法方案.
TO Cavalier:
VB这个语言其实入门算是最容易的了,其实网上有非常多的热心网友做了教程的,使用谷歌搜索就可以找到,不建议百度,容易出来大量无用的内容,降低搜索效率.
另外,如果是为了以后的工作而学习编程技术,建议学习C#,入门难度也是不高的,但是综合能力是非常好的,我最近也在打算学学呢:)
PS:书方面由于我自己看过的不多,所以没办法给你推荐,不好意思!