C#中的IntPtr类型(指针等用)
c#中無法將類型“int”隱式轉(zhuǎn)換為“System.IntPtr”
這個(gè)是我引用了一個(gè)api函數(shù)時(shí)出現(xiàn)的問題,我在聲明中把intptr換成了int還是不可以,這是為什么呢?要如何處理呢? 答: 您好,C#中的IntPtr類型稱為“平臺(tái)特定的整數(shù)類型”,它們用于本機(jī)資源,如窗口句柄。 資源的大小取決于使用的硬件和操作系統(tǒng),但其大小總是足以包含系統(tǒng)的指針(因此也可以包含資源的名稱)。所以,在您調(diào)用的API函數(shù)中一定有類似窗體句柄這樣的參數(shù),那么當(dāng)您聲明這個(gè)函數(shù)時(shí),您應(yīng)該將它顯式地聲明為IntPtr類型。
例如,在一個(gè)C#程序中調(diào)用Win32API mciSendString函數(shù)控制光盤驅(qū)動(dòng)器,這個(gè)函數(shù)的函數(shù)原型是:
MCIERROR mciSendString(
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
首先在C#中聲明這個(gè)函數(shù):
[DllImport("winmm.dll")]
private static extern long mciSendString(string a,string b,uint c,IntPtr d);
然后用這樣的方法調(diào)用:
mciSendString("set cdaudio door open", null, 0, this.Handle);
您也可以使用IntPtr.Zero將句柄設(shè)置為0;
或者使用類型強(qiáng)制轉(zhuǎn)換:
mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );
或者,使用IntPtr構(gòu)造函數(shù):
IntPtr a = new IntPtr(2121);
這里有兩點(diǎn)比較重要:
一是在C#中聲明Win32API時(shí),一定要按照WinAPI的原型來聲明,不要改變它的數(shù)據(jù)類型;
二是盡量不要過多使用類型強(qiáng)制轉(zhuǎn)換或構(gòu)造函數(shù)的方式初始化一個(gè)IntPtr類型的變量,這樣會(huì)使程序變得難于理解并容易出錯(cuò)。
希望這些信息對(duì)您有幫助。
本文章已收錄于: ?????????????????????
- 近來研究指針,在C#中談指針,就不得不談IntPtr,以下是我對(duì)IntPtr的初步了解,一些基礎(chǔ)。
一:什么是IntPtr
先來看看MSDN上說的:用于表示指針或句柄的平臺(tái)特定類型。這個(gè)其實(shí)說出了這樣兩個(gè)事實(shí),IntPtr 可以用來表示指針或句柄、它是一個(gè)平臺(tái)特定類型。對(duì)于它的解釋,這個(gè)哥們寫的比較好: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#調(diào)用WIN32 API時(shí)
(2)C#調(diào)用C/C++寫的DLL時(shí)(其實(shí)和1相同,只是這個(gè)一般是我們?cè)诤退撕献鏖_發(fā)時(shí)經(jīng)常用到)
三:怎樣用
例如有一函數(shù)原型定義為:DLLDemo_API?int?__stdcall Inptr_Test?(LONG param1, HWND hWnd);那么我們?cè)贑#中引用時(shí)就要這樣寫:
?[DllImport("DllPlayer.dll", EntryPoint = "IP_TPS_OpenStream")]
?public static extern int??Inptr_Test?(int param1, IntPtr hWnd);
在調(diào)用的時(shí)候就可以向Inptr_Test 的第二個(gè)參數(shù)傳入某一控件的Handle。這里涉及到C#類型與C++類型的對(duì)應(yīng)關(guān)系,網(wǎng)上這種有很多,這里就不再贅述,只談幾個(gè)經(jīng)常用到的和經(jīng)常出錯(cuò)的。
? ? ??(1)一般對(duì)于char* ,void*這種可以直接對(duì)應(yīng)IntPtr,比如在C#中,我們經(jīng)常用string類型,其轉(zhuǎn)換為IntPtr再傳給char*,void*等,轉(zhuǎn)換方法為
string txt="test";?Marshal.StringToCoTaskMemAuto(txt);
這里有時(shí)會(huì)用StringToCoTaskMemAnsi,不過StringToCoTaskMemAuto自動(dòng)分配內(nèi)存就可以了。這樣就會(huì)將txt的內(nèi)容復(fù)制到非托管的內(nèi)存塊中。
(2)對(duì)于結(jié)構(gòu)體,比如有一結(jié)構(gòu)體 StructText,將其轉(zhuǎn)換為Intptr,盡量不要直接用Marshal.StructureToPtr,這樣很容易出錯(cuò)。可以這樣來用:
int
size = Marshal.SizeOf(StructText);//獲取結(jié)構(gòu)體占用空間大小
IntPtr
intptr= Marshal.AllocHGlobal(size);//聲明一個(gè)同樣大小的空間
Marshal.StructureToPtr(StructText, intptr, true);//將結(jié)構(gòu)體放到這個(gè)空間中
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C#中的IntPtr类型(指针等用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新兴的多媒体格式——MXF 文件格式分析
- 下一篇: 苹果产品开发的绝密工作流程