VB指针 与CopyMemory
体会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的更多相关文章
- VB指针操作和消息钩子
		
二.VB怎么用指针 要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来. A.在讲解这两个问题之前,我们需要了解几个 ...
 - VB的使用
		
一.今天讲解VB的使用,明天讲解VC与VB的相互调用: 1.指针是什么? 不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示.在32位Windows平台 ...
 - move 和 CopyMemory的区别
		
Move(ABuffer,P, Sizeof(ABuffer)); //指针传递 Move(ABuffer^,P^, Sizeof(TArrayByte)); //复制内 ...
 - 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程
		
3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在 ...
 - 获取VB类模块成员函数指针(转)
		
最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...
 - VB 中 copymemory的有关问题
		
dim a() as long dim b() as bytecopymemory b(0),byval "1234",4 copymemory byval varptr(a(0) ...
 - VB.NET 内存指针和非托管内存的应用
		
介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存.然而利用.NET框架中的structures 和 classes,可以做许多类似的事情.它们包括 IntPtr, ...
 - VB.NET 指针
		
在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy.PtrToStringUni .PtrToStructure .OffsetOf.WriteXXX,Rrea ...
 - VB鼠标指针
		
vbDefault 0 (缺省值)形状由对象决定. VbArrow 1 箭头. VbCrosshair 2 十字线(crosshair 指针). VbIbeam 3 I 型 VbIconPointer ...
 
随机推荐
- bzoj1233: [Usaco2009Open]干草堆tower
			
Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号) ...
 - .Echo 命令中经常提到回显,是什么意思?
			
C:\>echo on C:\>date /t2006-08-06 星期日 C:\>以上内容是在打开回显的情况下执行的,其实我们想看到的只有2006-08-06 星期日这一行内容,但 ...
 - PLSQL Developer如何设置自动打开上次编辑的文件
			
作为开发人员经常把sql语句保存到文件中以方便下次继续使用,问题是plsqlDev重启后每次都需要手工打开这个文件,好不方便: 以下设置是plsqlDev启动后自动打开上次编辑的文件. 选择配置> ...
 - 简化 Django
			
http://www.oschina.net/translate/simplifying-django 尽管Django的流行和普及, 一些开发者仍然认为她是一个过时的web开发框架, 仅仅适合内容丰 ...
 - Jenkins安装入门
			
这是一次兴奋之旅哈..说不定用得着呢~~~:) 嘿嘿.. 安装很简单,JDK,MAVEN(如果),YUM或RPM包安装JENKINS(因为好像YUM安装好慢,不如RPM下载安装) 参考URL: htt ...
 - WM_SIZE和WM_MOVE的函数体内容为什么不一样?
			
搞不懂,要想一想- procedure TWinControl.WMSize(var Message: TWMSize); begin UpdateBounds; // 类函数 inherited; ...
 - PlatformTransactionManager
			
Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...
 - Linux Shell编程(3)——运行shell脚本
			
写完一个脚本,你能够运行它用命令:sh scriptname, [5] 另外也也可以用bash scriptname. 来执行(不推荐使用:sh <scriptname, 因为这样会禁止脚本从标 ...
 - 动态规划(背包问题):HRBUST 1377 金明的预算方案
			
金明的预算方案 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行 ...
 - VS插件 热
			
1. AnkhSVN - Subversion SCC Providerhttp://ankhsvn.open.collab.net/ AnkhSVN是一个VS的Subversion 源代码管理提供者 ...