楼主 xmyjk |
Q:在看西西的帖子,如何在VBA中使用钩子(HOOK)以及WINDOWS消息机制简介 http://www.exceltip.net/thread-37847-1-1.html
第一节,第五个部分,字符串,好奇,拿了个中文去处理,套用西西的代码,代码如下,结果出现很奇怪的问题:- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Sub st()
- Dim s As String, a() As Byte, cs As String, cd As Long, cs1 As String
- s = "你好"
- a = s
- cs = String(Len(s), vbNullChar) '设定缓存字符串
- CopyMemory ByVal cs, ByVal s, LenB(s) '拷贝字符串
- cs1 = String(Len(s), vbNullChar) '设定缓存字符串
- CopyMemory ByVal StrPtr(cs1), ByVal StrPtr(s), LenB(s) '拷贝字符串
- CopyMemory cd, ByVal StrPtr(s) - 4, 4
- Debug.Print cs, cs1, cd
- End Sub
立即窗口里面只有:你 你好 第一种方式,少了个好字。 奇怪了,这是为什么呢?,查了一些资料和请教了西西,大概了解了些。
A:经过如下测试,了解中文字节的传递情况。- Sub t2()
- Dim s As String, sb1(1 To 5) As Byte, sb2(1 To 5) As Byte, a() As Byte
- s = "你好"
- a = s '查看对应中文数组
- CopyMemory sb1(1), ByVal s, LenB(s) '复制到数组
- CopyMemory sb2(1), ByVal StrPtr(s), LenB(s) '复制到数组
- End Sub
所以,其实传回的还是四个这个字节的,VBA在英文和数字的传递,会安装西西帖子说的,转成asni格式的,会压缩了一半。 但是,中文方面,其实还是四个字节的这样,并没有压缩,所以,做缓存字符串要做两倍,传递过去的时候,会被压缩掉一半,然后接到后返回,就不会丢失,也就是,原来程序第六行,要改成lenb函数。 原程序修改如下,才能处理。就是,要lenb- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Sub st()
- Dim s As String, a() As Byte, cs As String, cd As Long, cs1 As String
- s = "你好"
- a = s
- cs = String(LenB(s), vbNullChar)
- CopyMemory ByVal cs, ByVal s, LenB(s) '其他代码还是一样,但是注意了,这里是lenb
- cs1 = String(Len(s), vbNullChar)
- CopyMemory ByVal StrPtr(cs1), ByVal StrPtr(s), LenB(s)
- CopyMemory cd, ByVal StrPtr(s) - 4, 4
- Debug.Print cs, cs1, cd
- End Sub
字符串API.zip |