内存Copy方面的几个问题

happyzhangjie 2007-05-12 04:21:44
问题一:
请帮忙解释下这个函数,模拟Varptr函数的函数
Function ObjPtr(obj As Object) As Long
'模拟Varptr,用来返回对象的指针
Dim lpObj As Long
CopyMemory lpObj, obj, 4
ObjPtr = lpObj
End Function
按照参考资料,CopyMemory的第二个参数默认传送的是obj的地址(指针),内存Copy后应该返回的是lpobj对象的值,为什么取这个对象的前4个字节就会变成这个对象的指针?请高手指点!

问题二:
Sub SwapStrPtr3(sA As String, sB As String)
 Dim lTmp As Long
 Dim pTmp As Long, psA As Long, psB As Long
 pTmp = StrPtr(sA): psA = VarPtr(sA): psB = VarPtr(sB)
 CopyMemory ByVal psA, ByVal psB, 4
 CopyMemory ByVal psB, pTmp, 4
End Sub
我知道用StrPtr得到的是真实的内存地址,用VarPtr得到的是相关的Ansi的内存地址,但在调试的时候为什么变量SA已经被第一个CopyMemory中覆盖数值的情况下还能将原始数值赋给变量SB?希望高手解答!!!!
...全文
287 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2007-05-12
  • 打赏
  • 举报
回复
2.想解决这个问题,你要明白对于字串而言,varptr和strptr各自的含义,你说
//我知道用StrPtr得到的是真实的内存地址
这点是正确的,用StrPtr会得到一个指向数据缓冲区的指针
//用VarPtr得到的是相关的Ansi的内存地址
这点恐怕不太确切,事实上用varptr(字串)得到的是一个指向数据缓冲区的指针的指针,也就是说,如果取出varptr(字串)对应内存地址数据的话,其值正好等于strptr(字串)

//但在调试的时候为什么变量SA已经被第一个CopyMemory中覆盖数值的情况下还能将原始数值赋给变量SB?希望高手解答!!!

事实上整个过程中无论是SA还是SB的数据缓冲区都没有发生变化,玩的是指针的把戏:

CopyMemory ByVal psA, ByVal psB, 4
这句的作用是令SA的指针指向SB的缓冲区,刚才我们已经说了"varptr对应内存地址数据的话,其值正好等于strptr",所以这里用byval 传递数据,其实这条语句也就是SA=SB

CopyMemory ByVal psB, pTmp, 4
这条语句,实际上等价于:
CopyMemory ByVal psB, ByVal psA, 4
只所以写:
CopyMemory ByVal psB, pTmp, 4
是因为,在:
CopyMemory ByVal psA, ByVal psB, 4
之后,SA的指针已经发生变化,已经不能再用上面的语句了,所以在开始的时候.事先对SA的指针做了一个记录,现在我们只要告诉SB它的缓冲区在哪里即可,语句即为:
CopyMemory ByVal psB, pTmp, 4
注意这里的传值方式




TechnoFantasy 2007-05-12
  • 打赏
  • 举报
回复
1、Object不是值类型的,而是引用类型的。obj实际保存的是对象的地址(在32位系统上地址占用4个字节),所以将地址拷贝到ObjPtr就可以引用到obj了。

7,787

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧