100分,谁能解释一下CopyMemory是怎么识别字节数组指针的?
本帖最后由 liucqa 于 2013-04-08 01:42:54 编辑
我在Excel 2007 VBA里面写如下代码:
Sub TestBSTRRef()
'替换BSTR变量指向字符串的指针,从而修改BSTR变量所指的字符串
Dim b(13) As Byte, vpstr As Long, vpbyte As Long, spstr As Long, str$
b(0) = 8
b(1) = 0
b(2) = 0
b(3) = 0
b(4) = 66
b(5) = 0
b(6) = 66
b(7) = 0
b(8) = 65
b(9) = 0
b(10) = 65
b(11) = 0
b(12) = 0
b(13) = 0
str = "MNP"
CopyMemory ByVal VarPtr(str),VarPtr(b(4)), 4 '把b(4)的地址,拷贝到BSTR变量里面,当作新的指针
MsgBox "长度是:" & Len(str) & vbCrLf & "字符串是" & str '输出长度4,字符串BBAA
End Sub
CopyMemory ByVal VarPtr(str), VarPtr(b(4)) , 4
这个语句可以显示正确的字符串内容,但有时会导致Excel死机(有的时候没事?)
谁知道CopyMemory是怎么识别字节数组指针的?
如何传递参数才能把一个字节数组模拟的BSTR字符串传递给BSTR变量呢?确保不死机
死机原因与Str变量中的字符串被无故抛弃是否有关?
谢谢!
BSTR
copymemory
vb指针 字节数组
vb指针
字节数组
------解决方案--------------------参考一下这个
------解决方案--------------------你最大的问题是破坏了内存管理。
原先指向字符串 "MNP" 的指针丢了,该内存无法释放。
而 b(0)~b(13) 这段内存即属于数组又属于字符串,会释放两次。
这样的隐患引起崩溃不稀奇。
这种玩弄内存的操作最后应该恢复原状。
------解决方案--------------------再来回答楼主题目中的问题。
CopyMemory ByVal VarPtr(str),VarPtr(b(4)), 4
等效于
Dim _Temp As Long
_Temp = VarPtr(b(4))
CopyMemory ByVal VarPtr(str),_Temp, 4
VarPtr(b(4)) 返回一个地址值,该值存放在一个临时变量中;
然后该变量又以 ByRef 的方式作为 CopyMemory 的参数,就是复制该变量的值——等于复制了地址值。