昨天在用winapi中的ReadProcessMemory方法,因为是在c#中使用所以需要将ReadProcessMemory方法的调用转成c#的形式.于是查了一下http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp网站上的方法,格式为
不废话,立刻调用,然后发现照这个方法调用,怎么都取不到内存中的数据,经过在网上查找其他资料,发现有人是将lpBaseAddress的类型定义为int或IntPtr,这样都可以取到了,所以发现lpBaseAddress是不能定义为object的.
而且对于object也决不能使用ref的形式,因为大家都知道ref关键字是传递参数的引用地址,本身引用类型的数据作为参数传递的时候就是将引用传递了过去,那再加上ref关键字的话就是将引用的引用传递了过去,这样在传递参数lpBuffer的时候会抛出未将对象引用设置到对象实例的异常,这也是可以理解的,如果改为out参数的话就不会出现这个问题,但是在本来就是传递了一个引用类型的参数时使用out参数也没有什么意义,有点画蛇添足的味道.
具体的ref和out关键字的区别说明可以看一下这个blog,我觉得说明的还是比较清楚了
http://iheshi.cnblogs.com/articles/132852.html
[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