一:什么是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. ehcache config xml file
  2. 用scikit-learn和pandas学习线性回归
  3. win 2016 ssh_如何使用BPF将SSH会话转换为结构化事件
  4. .net Core发布至IIS完全手册带各种踩坑
  5. spark 2.4安装
  6. PostgreSQL 查询涉及分区表过多导致的性能问题 - 性能诊断与优化(大量BIND, spin lock, SLEEP进程)
  7. 助力飞鸽传书高效沟通
  8. IntellijIDEA配置Maven
  9. 至强cpu型号列表_Cascade Lake全家福:图说第二代至强可扩展处理器
  10. Apache日志格式与配置
  11. hexo博客可以在百度谷歌搜索到
  12. ElasticSearch 中文同义词实现
  13. 知名互联网公司面试题
  14. 推特难民涌入「长毛象」!这个小众社交平台一夜爆红
  15. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
  16. STM32 定时器的简单应用 1ms中断代码
  17. JAVA 系列——包装类
  18. java读取文本文件,并且去除重复字段
  19. error pulling image configuration
  20. python解释器环境中用于表示上一次运算结果的特殊变量_Python语句print(type(1//2))的输出结果是...

热门文章

  1. python网页版本_python 网页版
  2. 一个“技术文化人”的片段感悟
  3. 如何删除IOS--CISCO IFS简介
  4. gaster字体转换器_gaster语言翻译器
  5. 惠普服务器自动装驱动安装,Win10系统不断自动安装HP打印机驱动且报错0x80240017的解决方法...
  6. dstwo linux 模拟器,dstwo md模拟器使用图文教程
  7. 中文版贾维斯语音助手Jarvis(电脑加强版Siri 已实现语音控制/自动播放下载音乐/天气播报/问路导航/搜索/计算器)
  8. mongovue 导入mysql_MongoVUE简单操作手册
  9. 苹果5越狱教程_unc0ver5.2.0安装方法 iOS13.5用Cydia Impactor或AltStore越狱教程
  10. windows怎么删除服务, OpenService 失败 5,拒绝访问解决