C 中的IntPtr型別

2021-04-23 12:32:09 字數 1063 閱讀 5652

c#中無法將型別「int」隱式轉換為「system.intptr」

這個是我引用了乙個api函式時出現的問題,我在宣告中把intptr換成了int還是不可以,這是為什麼呢?要如何處理呢? 答:

您好,c#中的intptr型別稱為「平台特定的整數型別」,它們用於本機資源,如視窗控制代碼。

資源的大小取決於使用的硬體和作業系統,但其大小總是足以包含系統的指標(因此也可以包含資源的名稱)。

所以,在您呼叫的api函式中一定有類似窗體控制代碼這樣的引數,那麼當您宣告這個函式時,您應該將它顯式地宣告為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型別的變數,這樣會使程式變得難於理解並容易出錯。

C 中的IntPtr使用

using system using system.collections.generic using system.linq using system.web using system.runtime.interopservices using system.diagnostics using s...

為什麼C 中要設計IntPtr

示例 intptr vertex someobj.get lock 0,someobj.get getsizeinbytes hardwarebuffer.lockoptions.hbl discard c 中的intptr相當於c 中的int 之所以在c 中存在intptr完全是為了相容基於c c...

關於IntPtr的資料

資料一說明 用於表示指標或控制代碼的平台特定型別。有關此型別所有成員的列表,請參閱 intptr 成員。system.object system.valuetype system.intptr 執行緒安全 此型別對多執行緒操作是安全的。備註 intptr 型別被設計成整數,其大小適用於特定平台。即是...