关于C#中的IntPtr

C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。

资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。

例如,我们可以在vs2008中用C#做基于OpenCV的图像处理开发,下面两行代码就可以完成打开一幅图像的操作。

IntPtr img = CvInvoke.cvLoadImage(openFileDialog.FileName,  

                     Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_UNCHANGED);

 CvInvoke.cvShowImage("打开图片", img);

  有时候会出现这种情况,在一个windows api中需要传递一个System.IntPtr 类型的值,传int型的不允许,在前面放(System.IntPtr)int,就提示无法从“System.InPtr”转换为“System.IntPtr” ,到底怎么回事呢?inptr不就是int型的么,是不是有种类型转换的语法呀?

       IntPtr 对应C中的void*; int对应Int32/Int64. int是有符号的,IntPtr作为内存地址来说是无符号的.c#中无法将类型“int”隐式转换为“System.IntPtr”。

所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。

例如,在一个C#程序中调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是:

MCIERROR mciSendString(

LPCTSTR lpszCommand,

LPTSTR lpszReturnString,

UINT cchReturn,

HANDLE hwndCallback

);

首先在C#中声明这个函数:

[DllImport("winmm.dll")]

private static extern long mciSendString(string a,string b,uint c,IntPtr d);

然后用这样的方法调用:

mciSendString("set cdaudio door open", null, 0, this.Handle);

您也可以使用IntPtr.Zero将句柄设置为0;

或者使用类型强制转换:

mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );

或者,使用IntPtr构造函数:

IntPtr a = new IntPtr(2121);

这里有两点比较重要

一是在C#中声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型;

二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错。

   

备注  

  IntPtr   类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在   32   位硬件和操作系统中将是   32   位,在   64   位硬件和操作系统上将是   64   位。  

  IntPtr   类型可以由支持指针的语言使用,并可作为在支持与不支持指针的语言间引用数据的一种通用方式。     

  IntPtr   对象也可用于保持句柄。例如,IntPtr   的实例广泛地用在   System.IO.FileStream   类中来保持文件句柄。  

  IntPtr   类型符合   CLS,而   UIntPtr   类型却不符合。只有   IntPtr   类型可用在公共语言运行库中。UIntPtr   类型大多数是提供来维护与   IntPtr   类型之间的体系结构上的对称性。  

    此类型实现   ISerializable   接口。

  System.Object  

        System.ValueType  

              System.IntPtr   

线程安全 

 此类型对多线程操作是安全的。   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值