IntPtr是什麼,該怎麼用

来源:互联网 发布:矩阵潜袭全扩要买哪些 编辑:程序博客网 时间:2024/06/01 08:20

http://blog.csdn.net/yang_629/article/details/7440115


IntPtr是什麼,該怎麼用 
  IntPtr用於表示指針或句柄的平台特定類型,此類型對多線程操作是安全的。C#中的IntPtr類型稱為「平台特定的整數類型」,它們用於本機資源,如窗口句柄。資源的大小取決於使用的硬件和操作系統,但其大小總是足以包含系統的指針(因此也可以包含資源的名稱)。 所以,在調用的API函數中一定有類似窗體句柄這樣的參數,那麼當聲明這個函數時,應該將它顯式地聲明為IntPtr類型。

  IntPtr 類型被設計成整數,其大小適用於特定平台。即是說,此類型的實例在 32 位硬件和操作系統中將是 32 位,在 64 位硬件和操作系統上將是 64 位。

  IntPtr 類型可以由支持指針的語言使用,並可作為在支持與不支持指針的語言間引用數據的一種通用方式。

 

  IntPtr 對象也可用於保持句柄。例如,IntPtr 的實例廣泛地用System.IO.FileStream 類中來保持文件句柄。

 
  IntPtr 類型符合 CLS,而 UIntPtr 類型卻不符合。只有 IntPtr 類型可用在公共語言運行庫中。UIntPtr 類型大多數是提供來維護與 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類型的變量,這樣會使程序變得難於理解並容易出錯


原创粉丝点击