一:什么是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,这样很容易出错。可以这样来用:

int size = Marshal.SizeOf(StructText);//获取结构体占用空间大小

IntPtr intptr= Marshal.AllocHGlobal(size);//声明一个同样大小的空间

Marshal.StructureToPtr(StructText, intptr, true);//将结构体放到这个空间中

最新文章

  1. hashmap先按照value从大到小排序,value相等时按照key从小到大排序
  2. 我所经历的JS性能优化
  3. 解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  4. Dynamics CRM4.0 和 Dynamics CRM2011 Plugin 实现一样的功能的方法的比较
  5. MySQL用命令行导出数据库
  6. MySQL重置root密码的几种方法(windows+Linux)
  7. 扩展 Windows Azure 运营能力 – 巴西
  8. Logistic Regression(逻辑回归)(二)—深入理解
  9. [问题记录]父元素position:relative的深坑
  10. 【重学计算机】操作系统D6章:并发程序设计
  11. SQL Server 2008R2 :远程调用失败 的解决方法(全部方法)
  12. pycharm远程调试服务器
  13. MapReduce的工作原理
  14. python学习日记(OOP——反射)
  15. 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法
  16. HDU 1880 魔咒词典 (Hash)
  17. 编译安装lamp环境
  18. Oracle查询表主键、外键
  19. JS之事件机制
  20. C# 初学

热门文章

  1. hiho 1182 : 欧拉路·三
  2. 【Android学习】尺寸单位 px in mm pt dp sp
  3. Windows7 下配置添加ASP功能
  4. 重建Mac系统的文件打开方式
  5. C#判断Textbox是否为数字
  6. 对于Linux和windows的个人的看法
  7. jqGrid API 相关
  8. 【leetcode】5. Longest Palindromic Substring
  9. 利用多核来加速Linux命令行
  10. Qt移植 Window --Linux