体会ByVal和ByRef
Dim k As Long

CopyMemory ByVal VarPtr(k), 40000, 4
等同于k=40000;从保存常数40000(缺省ByRef)的临时变量处(地址)拷贝4个字节到变量k所在的内存中。

CopyMemory ByVal VarPtr(k), ByVal 40000, 4
k=(40000的地址);从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存我们无权访问,操作系统会给我们一个Access Violation内存越权访问错误

CopyMemory VarPtr(k), 40000, 4
从保存常数40000的临时变量处(地址)拷贝4个字节(即40000),到保存变量k所在内存地址值的临时变量处。这不会出出内存越权访问错误,但k的值并没有变。

'看看我们的东西被拷贝到哪儿去了
Sub TestCopyMemory()
  Dim i As Long, k As Long
  k = 5
  i = VarPtr(k)
  CopyMemory i, 40000, 4 'NOTE4:
  Debug.Print k
  Debug.Print i

  i = VarPtr(k)
  CopyMemory ByVal i, 40000, 4 'NOTE5:
  Debug.Print k
End Sub

   程序输出:
5
40000
40000
由于NOTE4处使用缺省的ByVal,传递的是i的地址(也就是指向i的指针),所以常量40000拷贝到了变量i里,因此i的值成了40000,而k的值却没有变化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做为一个指针来使用。这时,我们必须如NOTE5那样用ByVal来传递指针i,由于i是指向变量k的指针,所以最后常量40000被拷贝了变量k里

'使用更安全的CopyMemory,明确的使用指针!
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Sub SwapStrPtr2(sA As String, sB As String)
  Dim lTmp As Long
  Dim pTmp As Long, psA As Long, psB As Long
  pTmp = VarPtr(lTmp): psA = VarPtr(sA): psB = VarPtr(sB)
  CopyMemory pTmp, psA, 4
  CopyMemory psA, psB, 4
  CopyMemory psB, pTmp, 4
End Sub

   注意,上面CopyMemory的声明,用的是ByVal和long,要求传递的是32位的地址值,当我们将一个别的类型传递给这个API时,编译器会报错,比如现在我们用下面的语句:

VB指针 与CopyMemory的更多相关文章

  1. VB指针操作和消息钩子

    二.VB怎么用指针       要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来.       A.在讲解这两个问题之前,我们需要了解几个 ...

  2. VB的使用

    一.今天讲解VB的使用,明天讲解VC与VB的相互调用: 1.指针是什么?    不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示.在32位Windows平台 ...

  3. move 和 CopyMemory的区别

    Move(ABuffer,P, Sizeof(ABuffer));   //指针传递            Move(ABuffer^,P^, Sizeof(TArrayByte));   //复制内 ...

  4. 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

    3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在 ...

  5. 获取VB类模块成员函数指针(转)

    最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...

  6. VB 中 copymemory的有关问题

    dim a() as long dim b() as bytecopymemory b(0),byval "1234",4 copymemory byval varptr(a(0) ...

  7. VB.NET 内存指针和非托管内存的应用

    介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存.然而利用.NET框架中的structures 和 classes,可以做许多类似的事情.它们包括 IntPtr,   ...

  8. VB.NET 指针

    在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy.PtrToStringUni .PtrToStructure .OffsetOf.WriteXXX,Rrea ...

  9. VB鼠标指针

    vbDefault 0 (缺省值)形状由对象决定. VbArrow 1 箭头. VbCrosshair 2 十字线(crosshair 指针). VbIbeam 3 I 型 VbIconPointer ...

随机推荐

  1. 一个小知识,shell如何输出换行符号

    一般来说如果在echo里直接写上\n,他不会被转义,必须加上-e参数 echo "hello\n morning" # 输出为 hello\n morning echo -e &q ...

  2. 转:gpio_direction_output 与 gpio_set_value

    gpio_set_value(port_num,0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了! 而gpio_direction_output (por ...

  3. BZOJ 1588 营业额统计

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  4. 3.2. Grid Search: Searching for estimator parameters

    3.2. Grid Search: Searching for estimator parameters Parameters that are not directly learnt within ...

  5. MYSQL的binary解决mysql数据大小写敏感问题 《转载》

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写如下:mysql> select binary 'ABCD'='abcd ...

  6. VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数

    这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵. 至于MakeObjectInstance是 ...

  7. CreateProcessWithLogonW(好像可以指定进程的上下文环境)

    Creates a new process and its primary thread. Then the new process runs the specified executable fil ...

  8. CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体

    VCL存在一些非API消息以供其内部使用,为什么要这样做呢?这要从WM_COMMAND & WM_NOTIFY消息说起,我们说WM_COMMAND消息并不是直接发给实际产生消息的窗体,而是发送 ...

  9. Android Wear开发 - 入门指引 - Eclipse开发平台搭建

    开发平台配置 下载最新版本的ADT,详情见官网:http://developer.android.com/sdk/installing/installing-adt.html .(之前一直习惯于Goo ...

  10. 【HDOJ】2717 Catch That Cow

    bfs. /* 2717 */ #include <iostream> #include <cstdio> #include <cstring> #include ...