初识IntPtr
来源:互联网 发布:手机淘宝如何打造爆款 编辑:程序博客网 时间:2024/06/05 18:59
近来研究指针,在C#中谈指针,就不得不谈IntPtr,以下是我对IntPtr的初步了解,一些基础。
一:什么是IntPtr
先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the platform.
二:用在什么地方
(1)C#调用WIN32 API时
(2)C#调用C/C++写的DLL时(其实和1相同,只是这个一般是我们在和他人合作开发时经常用到)
三:怎样用
例如有一函数原型定义为:DLLDemo_API int __stdcall Inptr_Test (LONG param1, HWND hWnd);那么我们在C#中引用时就要这样写:
[DllImport("DllPlayer.dll", EntryPoint = "IP_TPS_OpenStream")]
public static extern int Inptr_Test (int param1, IntPtr hWnd);
在调用的时候就可以向Inptr_Test 的第二个参数传入某一控件的Handle。这里涉及到C#类型与C++类型的对应关系,网上这种有很多,这里就不再赘述,只谈几个经常用到的和经常出错的。
(1)一般对于char* ,void*这种可以直接对应IntPtr,比如在C#中,我们经常用string类型,其转换为IntPtr再传给char*,void*等,转换方法为
string txt="test"; Marshal.StringToCoTaskMemAuto(txt);
这里有时会用StringToCoTaskMemAnsi,不过StringToCoTaskMemAuto自动分配内存就可以了。这样就会将txt的内容复制到非托管的内存块中。
(2)对于结构体,比如有一结构体 StructText,将其转换为Intptr,尽量不要直接用Marshal.StructureToPtr,这样很容易出错。可以这样来用:
intsize = Marshal.SizeOf(StructText);//获取结构体占用空间大小
IntPtrintptr= Marshal.AllocHGlobal(size);//声明一个同样大小的空间
Marshal.StructureToPtr(StructText, intptr, true);//将结构体放到这个空间中
转自:http://blog.csdn.net/qcontriver/article/details/9455481
- 初识IntPtr
- 初识IntPtr
- 初识IntPtr
- 初识IntPtr
- 初识IntPtr
- 初识IntPtr
- 初识IntPtr
- IntPtr
- IntPtr
- IntPtr类型
- IntPtr简介
- IntPtr介绍
- IntPtr类型
- IntPtr to String or String to IntPtr IntPtr stringPointer
- C#中的IntPtr使用
- C#中的IntPtr类型
- 关于IntPtr的资料
- C#中的IntPtr类型
- Linux(LAMPP)下使用MySQL时不能正常显示中文的解决办法
- 使用命令行上传代码到github
- 278. First Bad Version [easy] (Python)
- ssh-keygen的使用方法
- 资本寒冬,看咕咚、Keep、Feel们如何逆势而上
- 初识IntPtr
- CGI和Servlet的对比
- 一起学Netty(二十)netty的比较规范的C/S端的写法
- 第一个JNI例子
- 编写类似strcmp() strncmp()函数
- Hive ORC数据格式的MapReduce读写
- 微服务应用-基于Spring Cloud和Docker构建电影推荐微服务
- Ant自动编译Java project时无法找到rt.jar的处理方法
- 显示Intent和隐式Intent的使用(意图)