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 Inprt_Test(LONG param1,HWND hWnd);那么我們在c#中引用時就要這樣寫:

[DllImport("DllPlayer.dll",EntryPoint = "IP TPS OpenSteam")]

 

public static extern int Inptr_Test(int param1,InPtr hWnd);

 

在調用的時候就可以向Inptr_Test的第二個參數傳入某一控件的Handle。這里涉及到c#類型與c++類型的對應關系,網上這種有很多,這里就不在贅述,只談幾個經常用到的和經常出錯的。

 

(1)一般對於char*,void*這種可以直接對應InPtr,比如在c#中,我們經常用string類型,其轉化為Inptr再傳給char*,void*等,轉換方法為

 

string txt = “test”;Marshal.StringToCoTaskMemAuto(txt);

 

這里有時會用StringToCoTaskMemAnsi,不過StringToCoTaskMemAuto自動分配內存就可以了,這樣會將txt的內容復制到非托管的內存塊中。

(2)對於結構體,比如有一結構體StructText,將其轉換為InPtr,盡量不要直接用Marshal.StructureToPtr,這樣很容易出錯,可以這樣來用:

 

int size = Marshal.SizeOf(sTRUCText);//獲取結構體占用控件大小

IntPtr intptr = Marshal.AllocHGlobal(size);  //聲明一個同樣大小的空間

Marshal.StructureToPtr(StructText,inptr,true);//將結構體放到這個空間中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM