康耐德智能

 康耐德智能,点胶AOI系统专家!

 服务热线:0769-28680919  手机:15322933971

图片展示
搜索

更多资讯

分类标题

关注康耐德智能

        

电话:0769-28680919

传真:0769-28680910

邮箱:csray@csray.com

地址:东莞市南城区天安数码城C2栋507室


C#中IntPtr类型

作者:东莞康耐德智能控制有限公司 浏览: 发表时间:2021-08-27 16:22:49

 

C#中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.

 

C#中IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。在调用API函数时,类似含有窗口句柄参数(HANDLE)的原型函数,应显示地声明为IntPtr类型。

 

IntPtr类型设计为一个整数,其大小是特定于平台的。也就是说,此类型的实例应该是32位硬件和操作系统上的32位,以及64位硬件和操作系统上的64位。

IntPtr类型可以由支持指针的语言和在执行和不支持指针的语言之间引用数据的一种常用方式来使用。IntPtr对象也可以用来容纳句柄。例如,在IntPtr类中广泛使用的实例, System.IO.FileStream 以保存文件句柄。IntPtr类型符合 CLS,而UIntPtr类型则为。 仅IntPtr在公共语言运行时中使用类型。UIntPtr提供此类型主要是为了维护类型的体系结构对称IntPtr 。

 

 

二:用在什么地方

(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"; 

IntPtr p=Marshal.StringToCoTaskMemAuto(txt);

string s=Marshal.PtrToStringAnsi(p);

string s = Marshal.PtrToStringAuto(p);

Marshal.FreeHGlobal(p);

这里有时会用StringToCoTaskMemAnsi,不过StringToCoTaskMemAuto自动分配内存就可以了。这样就会将txt的内容复制到非托管的内存块中。

 

(2) 对于结构体,比如有一结构体 StructText,将其转换为Intptr,尽量不要直接用Marshal.StructureToPtr,这样很容易出错。可以这样来用:

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

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

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

 

 

 


广东省东莞市南城区黄金路1号天安数码城C2-507

电话:0769-28680919

手机:15322933971

邮箱:csray@csray.com

版权所有:东莞康耐德智能控制有限公司

在线客服
联系方式
热线电话
0769-28680919
手机服务
15322933971
上班时间
周一到周五
二维码
二维码
在线客服
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功
添加微信好友,详细了解产品
我知道了