C#中IntPtr類型的具體使用
什么是IntPtr
先來(lái)看看MSDN上說的:用于表示指針或句柄的平臺(tái)特定類型。這個(gè)其實(shí)說出了這樣兩個(gè)事實(shí),IntPtr 可以用來(lái)表示指針或句柄、它是一個(gè)平臺(tái)特定類型。
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);?
1.C#中的IntPtr類型被稱之為“平臺(tái)特定的整數(shù)類型”,用于本機(jī)資源,例如窗口句柄。
2.資源的大小取決于使用的硬件和操作系統(tǒng),即此類型的實(shí)例在32位硬件和操作系統(tǒng)中將是32位,在64位硬件和操作系統(tǒng)中將是64位;但其大小總是足以包含系統(tǒng)的指針(因此也可以包含資源的名稱)。
3.在調(diào)用API函數(shù)時(shí),類似含有窗口句柄參數(shù)(HANDLE)的原型函數(shù),應(yīng)顯示地聲明為IntPtr類型。
4.IntPtr類型對(duì)多線程操作是安全的。
5. int 和IntPtr互轉(zhuǎn)
int i=1;? IntPtr p=new IntPtr(i); ? int ch_i=(int) p;
6. IntPtr和string互轉(zhuǎn)
string str="a"; IntPtr p=Marshal.StringToHGlobalAnsi(str); string s=Marshal.PtrToStringAnsi(p); Marshal.FreeHGlobal(p);
到此這篇關(guān)于C#中IntPtr類型的具體使用的文章就介紹到這了,更多相關(guān)C# IntPtr類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧
這篇文章主要介紹了C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧,這在很時(shí)候應(yīng)該都非常有用,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07
C#微信公眾平臺(tái)開發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新
這篇文章主要介紹了C#微信公眾平臺(tái)開發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新的相關(guān)資料,需要的朋友可以參考下2016-03-03
C#解決訪問API顯示基礎(chǔ)連接已經(jīng)關(guān)閉的問題
最近在 Web 部署百度 AI 圖像識(shí)別 AipSdk.dll 封裝庫(kù)的時(shí)候,在調(diào)用OCR圖像識(shí)別 API 的時(shí)候,顯示為 “ 基礎(chǔ)連接已經(jīng)關(guān)閉: 接收時(shí)發(fā)生錯(cuò)誤,” ,并且運(yùn)行后直接崩潰,所以本文給大家介紹了C#解決訪問API顯示基礎(chǔ)連接已經(jīng)關(guān)閉的問題,需要的朋友可以參考下2024-12-12
C# 使用匿名函數(shù)解決EventHandler參數(shù)傳遞的難題
C#動(dòng)態(tài)生成PictureBox并綁定右鍵菜單,實(shí)現(xiàn)刪除圖片2009-05-05
C#實(shí)現(xiàn)兩個(gè)richtextbox控件滾動(dòng)條同步滾動(dòng)的簡(jiǎn)單方法
這篇文章主要給大家介紹了C#實(shí)現(xiàn)兩個(gè)richtextbox控件滾動(dòng)條同步滾動(dòng)的簡(jiǎn)單方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類
這篇文章介紹了C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C#創(chuàng)建數(shù)據(jù)庫(kù)及導(dǎo)入sql腳本的方法
這篇文章主要介紹了C#創(chuàng)建數(shù)據(jù)庫(kù)及導(dǎo)入sql腳本的方法,涉及C#針對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建、連接、導(dǎo)入等相關(guān)操作技巧,需要的朋友可以參考下2015-12-12
C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法小結(jié)
這篇文章主要介紹了C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法,實(shí)例總結(jié)了兩個(gè)常用的數(shù)字補(bǔ)0的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C#使用CallContext緩存線程數(shù)據(jù)
這篇文章介紹了C#使用CallContext緩存線程數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

