一:什么是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(它是一个类,它封装了调用WindowsAPI函数时使用的指针。根据平台的不同,底层指针可以是32位,也可以是64位).

二:用在什么地方

(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);//将结构体放到这个空间中
 // ch:保存图片 | en:Save imageprivate void SaveImage(IntPtr pData, MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo,int nIndex){if ((3 * stFrameInfo.nFrameLen + 2048) > m_nBufSizeForSaveImage){m_nBufSizeForSaveImage = 3 * stFrameInfo.nFrameLen + 2048;m_pBufForSaveImage = Marshal.AllocHGlobal((Int32)m_nBufSizeForSaveImage);}MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX();stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp;stSaveParam.enPixelType = stFrameInfo.enPixelType;stSaveParam.pData = pData;stSaveParam.nDataLen = stFrameInfo.nFrameLen;stSaveParam.nHeight = stFrameInfo.nHeight;stSaveParam.nWidth = stFrameInfo.nWidth;stSaveParam.pImageBuffer = m_pBufForSaveImage;stSaveParam.nBufferSize = m_nBufSizeForSaveImage;//stSaveParam.nJpgQuality = 80;//存Jpeg时有效int nRet = m_pMyCamera[nIndex].MV_CC_SaveImageEx_NET(ref stSaveParam);if (MyCamera.MV_OK != nRet){string temp = "No."  + (nIndex + 1).ToString() + "Device save Failed!";ShowErrorMsg(temp,0);}else{string[] path = { "image1.bmp", "image2.bmp", "image3.bmp", "image4.bmp" };Byte[] bArrBufForSaveImage = new Byte[stSaveParam.nImageLen];Marshal.Copy(m_pBufForSaveImage, bArrBufForSaveImage, 0, (Int32)stSaveParam.nImageLen);Marshal.Release(m_pBufForSaveImage);FileStream file = new FileStream(path[nIndex], FileMode.Create, FileAccess.Write);file.Write(bArrBufForSaveImage, 0, (int)stSaveParam.nImageLen);file.Close();string temp = "No." + (nIndex + 1).ToString() + "Device Save Succeed!";ShowErrorMsg(temp,0);}}

C# 中intptr用法相关推荐

  1. c++中static_cast用法与uchar/char的区别

    1.c++中static_cast用法 static_cast是指显性类型强制转换,如: int a = static_cast<int>(120.34); 结果为a= 120. 和C语言 ...

  2. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  3. 关于OpenCV中常见函数用法总结

    关于OpenCV中常见函数用法总结 一 一般Mat的赋值操作 二 求Mat中的最大值以及最小值 三 randn()函数给图像添加高斯噪声 四 mean()函数的用法 五 系统计时器 六 矩阵之间的四则 ...

  4. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  5. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

  6. 几个比较好用的Windows API在C#中的用法。

    几个比较好用的Windows API在C#中的用法. #region Windows Api 定义 ///   /// 模拟鼠标事件   ///   /// 鼠标事件的Enum   /// X座标   ...

  7. python管道界面_python中管道用法入门实例

    本文实例讲述了python中管道用法.分享给大家供大家参考.具体如下: #!coding=utf-8 import multiprocessing def consumer(pipe): output ...

  8. MVC中HtmlHelper用法大全

    MVC中HtmlHelper用法大全参考 解析MVC中HtmlHelper控件7个大类中各个控件的主要使用方法(1) 2012-02-27 16:25 HtmlHelper类在命令System.Web ...

  9. mysql raiserror_RAISERROR在SQL Server数据库中的用法

    raiserror  是由单词 raise error 组成 raise  增加; 提高; 提升 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql ser ...

  10. 查询前几条记录SQL在不同数据库中的用法

    13,(1)查询前几条记录SQL在不同数据库中的用法; 1. ORACLE SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. INFORMIX SELECT FIR ...

最新文章

  1. 163data.com.cn data
  2. eclipse java shell 窗体显示 bat运行不显示_java eclipse中如何实现点击主窗口sShell中的按钮打开另外一个子窗口sShell...
  3. 【教女朋友学网络系列2】之进制转换及IP地址类
  4. ad域管理与维护_U-Mail邮件系统LDAP/AD同步极大提升办公效率
  5. 获取当前日期时间并格式化 - 常见格式
  6. Enews博客/CMS/双模式主题源码
  7. Spring实战(六)自动装配的歧义性
  8. Python变量、脚本名称、函数命名规范
  9. ubuntu jdk tomcat mysql_linux-ubuntu tomcat jdk 及 mysql 安装配置
  10. 高性能Mysql(第三版)
  11. 计算DSP程序运行时间
  12. CAD文字宽度因子无法修改解决办法
  13. Markdown写作工具盘点
  14. Win7下安装Windows SDK
  15. ID卡、IC卡,RFID卡,NFC卡的简单介绍
  16. Hadoop+hive+flask+echarts大数据可视化项目之hive环境搭建与系统数据的分析思路
  17. 笔记|数据分析:指标体系中的标准化方法
  18. 【乐易考看高校】大学生创业孵化基地启动仪式暨2015届毕业生供需洽谈会11月16日在赤峰学院举行
  19. 微信分账功能与微信支付企业付款相关内容详解(payjs版)
  20. gitee代码提交方式

热门文章

  1. 吃鸡ios和android灵敏度,吃鸡手游pc版怎么调灵敏度参数教程 | 手游网游页游攻略大全...
  2. java随机数种子_使用种子的Java随机数
  3. win32API中文参考手册
  4. rom lg g2 f320d android 4.4.2,LG G2(F320K/S/L/D8001/D802)官方KDZ刷机教程
  5. Linux命令之find命令
  6. 如何转化知网CAJ格式的论文为PDF?
  7. 计算机中官方文档阅读方法,中国知网-帮助中心
  8. ZigBee与Android的智能家居控制系统设计
  9. 电商峰值系统架构设计
  10. vmplayer虚拟机文件夹共享不生效解决方法