MyException - 我的异常网
当前位置:我的异常网» VB » 100分,哪位高手能解释一下CopyMemory是如何识别字

100分,哪位高手能解释一下CopyMemory是如何识别字节数组指针的

www.myexceptions.net  网友分享于:2013-04-10  浏览:3次
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 的参数,就是复制该变量的值——等于复制了地址值。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有