学习,不断的学习

欢迎大家提供宝贵经验
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

从使用ReadProcessMemory方法了解的ref和out

Posted on 2006-01-08 19:54  sholden  阅读(1730)  评论(0编辑  收藏  举报
昨天在用winapi中的ReadProcessMemory方法,因为是在c#中使用所以需要将ReadProcessMemory方法的调用转成c#的形式.于是查了一下http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp网站上的方法,格式为
[DllImport("kernel32.dll", SetLastError=true)]

static extern int ReadProcessMemory ( int hProcess, ref object lpBaseAddress, ref object lpBuffer, int nSize, ref int lpNumberOfBytesWritten)


不废话,立刻调用,然后发现照这个方法调用,怎么都取不到内存中的数据,经过在网上查找其他资料,发现有人是将lpBaseAddress的类型定义为int或IntPtr,这样都可以取到了,所以发现lpBaseAddress是不能定义为object的.

而且对于object也决不能使用ref的形式,因为大家都知道ref关键字是传递参数的引用地址,本身引用类型的数据作为参数传递的时候就是将引用传递了过去,那再加上ref关键字的话就是将引用的引用传递了过去,这样在传递参数lpBuffer的时候会抛出未将对象引用设置到对象实例的异常,这也是可以理解的,如果改为out参数的话就不会出现这个问题,但是在本来就是传递了一个引用类型的参数时使用out参数也没有什么意义,有点画蛇添足的味道.

具体的ref和out关键字的区别说明可以看一下这个blog,我觉得说明的还是比较清楚了

http://iheshi.cnblogs.com/articles/132852.html