程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> IntPtr介紹(入門級別)

IntPtr介紹(入門級別)

編輯:C#基礎知識
近來研究指針,在C#中談指針,就不得不談IntPtr,以下是我對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.

二:用在什麼地方

(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);//將結構體放到這個空間中
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved