Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 7257|回复: 9

求助CopyMemory的使用方法

[复制链接]
发表于 2012-2-21 10:28 | 显示全部楼层 |阅读模式
资料馆两个api手册没它的帮助。百度找的,也学不会。

就在论坛里搜“CopyMemory”,找到些,还是不会用。比如,[求助]Variant数组变换时怎样才能不崩溃? 6#,因为这是发现的最短的例子,本以为可能会好理解些,结果运行后Excel自动退出了(03和10都是)。
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  2. (Destination As Any, Source As Any, ByVal Length As Long)
  3. Sub Test()
  4. Dim MyStr1 As Variant
  5. Dim MyStr2 As Variant
  6. MyStr1 = "amulee"
  7. MyStr2 = String$(6, 0)
  8. CopyMemory ByVal MyStr2, ByVal MyStr1, 6
  9. Debug.Print MyStr2
  10. End Sub
复制代码
可否以一个小例子来说明,CopyMemory的基本用法?若本例(阿木这个)不好解释,另举例也行。
谢谢!



发表于 2012-2-21 14:41 | 显示全部楼层
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

'copymemory可以实现不同维数数组间的转换,如:

Sub xxx()
    Dim arr1(), arr2(1 To 3, 1 To 4)
    arr1 = Range("a2:a13")
    CopyMemory ByVal VarPtr(arr2(1, 1)), ByVal VarPtr(arr1(1, 1)), 12 * 16    'variant需要16个字节存储空间
    Range("b4:e6") = arr2
End Sub


评分

参与人数 1 +14 收起 理由
liuts + 14 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-2-21 14:50 | 显示全部楼层
老糊涂 发表于 2012-2-21 14:41
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ...

谢谢老糊涂提供的例子!

看到一些copymemory的例子,自己还是不大懂。
听阿木说,1楼示例声明成文本没事了,只是自己还不明白:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
                               (Destination As Any, Source As Any, ByVal Length As Long)
Sub Test()
    Dim MyStr1 As String
    Dim MyStr2 As String
    MyStr1 = "amulee"
    MyStr2 = String$(6, 0)
    CopyMemory ByVal MyStr2, ByVal MyStr1, 6
    Debug.Print MyStr2
End Sub




回复

使用道具 举报

 楼主| 发表于 2012-2-21 16:29 | 显示全部楼层
网上翻了下,感觉此问题下的更小问题,我还有很多不清楚,我再再看好了
回复

使用道具 举报

发表于 2012-2-21 17:21 | 显示全部楼层
如果只是简单的类型还好,如果涉及到数组,Variant,String还是很复杂的

点评

吕布版主好多次用到这函数,希望能跟着学习呵呵  发表于 2012-2-21 17:24
回复

使用道具 举报

 楼主| 发表于 2012-2-21 17:30 | 显示全部楼层
请看下面的这一段代码:

首先OFFICEBA给大家看一段程序:

Private Sub good()
    Dim strTemp As String
    strTemp = Application.InputBox("test", "OFFICEBA温馨提示 - http://www.officeba.com.cn/", "False")
    If StrPtr(strTemp) = 0 Then
        MsgBox "取消"
    Else
        MsgBox "确定"
    End If
End Sub
有看到StrPtr(strTemp)这个吧。这里的StrPtr是什么呢。StrPtr:返回真正的UNICODE字符串缓冲区的地址。也就是字符串变量在内存的地址!
StrPtr是唯一能直观地告诉你空字符串(点击确定时返回的值)和null字符串(点击取消时返回的值)的不同的方法。对于null字符串(vbNullString),StrPtr的返回值为0(因为变量中什么都没有),而对于空字符串,函数的返回值为非零(即字符串地址值)。
VBA中,我们还可以利用Application.InputBox来代替InputBox函数,但有了这个方法,你就可以区别上面的情况了!
在VBA程序中,InputBox函数用于输入字符串,提供了一个文本框和确定、取消两个按钮,如果按 “确定” 则返回文本框内的内容,按 “取消” 则返回一个长度为零的字符串 (""),但是如果文本框内没有内容,“确定”是返回(""),“取消”也是返回(""),那么怎样在VBA中区分呢?
回复

使用道具 举报

 楼主| 发表于 2012-2-21 17:46 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-21 18:08 编辑

6楼所有内容,是找来的转帖(原帖广告太多)。
现在,感觉认识copymemory前,必须要先认识这3个帮手(隐藏函数):VarPtr,StrPtr,ObjPtr。而4楼例子正说的是StrPtr。因为个人习惯看简单例子才好学,所以在原例子上修改如下:


  1. Sub test()
  2.     Dim x As String
  3.     Dim n As Long
  4.     x = Application.InputBox("随便输入些字符吧:", , "www.excelpx.com")
  5.     n = StrPtr(x) '显示变量x的内存地址
  6.     Stop
  7. End Sub
复制代码


03结果:显示一个7位数a,再运行test,是另一个7位数b,再运行test,又是a,再运行test,又是b,反复.....
10结果:同上,只是数字是8位。也是一直反复。

StrPtr函数是返回变量的内存地址。不知这么说准确么?

--- 先去吃饭罗


回复

使用道具 举报

 楼主| 发表于 2012-2-21 20:08 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-22 12:13 编辑
  1. Sub test2() '字符串数组
  2.     Dim arr(2) As String
  3.     Dim i As Long
  4.         
  5.     '初始化后,赋值之前
  6.     Debug.Print "元素", "内存地址"
  7.     For i = 0 To UBound(arr)
  8.         Debug.Print i, StrPtr(arr(i))
  9.     Next i
  10.     '赋值
  11.     For i = 0 To UBound(arr)
  12.         arr(i) = i
  13.     Next i
  14.     '赋值之后
  15.     Debug.Print "元素", "内存地址"
  16.     For i = 0 To UBound(arr)
  17.         Debug.Print i, StrPtr(arr(i))
  18.     Next i
  19. End Sub
复制代码
收集
1)变量初始化后,赋值之前,内存地址为0
2)数组的内存地址不连续
3)再读时,就变了。

1)为啥叫strPtr?str,字符串嘛,那ptr是啥呢
2)有没有strptr的反函数呢?形如 xxx(内存地址),返回一个字符或其它实际存储在里面的数据。
如果高手路过了,请指点下吧
PS:没最佳,只为能学习到点啥




转自:http://wenku.baidu.com/view/af430b3310661ed9ad51f376.html
VarPtr:返回变量地址。
StrPtr:返回真正的UNICODE字符串缓冲区的地址。也就是字符串变量在内存的地址!
ObjPtr:返回任何对象变量引用的地址。





相关参考:

用VarPtr传给CopyMemory拷贝字符串
http://topic.csdn.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html

[API] 有关API字符串--API programmer请看之一

[API] VB中利用CopyMemory使用指针
真不是一下能明白的,越看越远了。。。。。。。。。。。。先放着,以后慢慢的理解{:031:}

回复

使用道具 举报

发表于 2012-2-22 09:09 | 显示全部楼层
找的很仔细,看它的博客总结可能更好
http://blog.csdn.net/slowgrace/article/details/4549926
回复

使用道具 举报

发表于 2012-3-4 12:00 | 显示全部楼层
这个真不会。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 08:03 , Processed in 0.378671 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表