我引用了一個api函數(shù)時出現(xiàn)無法將類型“int”隱式轉(zhuǎn)換為“System.IntPtr” 的問題,我在聲明中把intptr換成了int還是不可以,這是為什么呢?要如何處理呢?
C#中的IntPtr類型稱為“平臺特定的整數(shù)類型”,它們用于本機資源,如窗口句柄。
資源的大小取決于使用的硬件和操作系統(tǒng),但其大小總是足以包含系統(tǒng)的指針(因此也可以包含資源的名稱)。
所以,在您調(diào)用的API函數(shù)中一定有類似窗體句柄這樣的參數(shù),那么當(dāng)您聲明這個函數(shù)時,您應(yīng)該將它顯式地聲明為IntPtr類型。
例如,在一個C#程序中調(diào)用Win32API mciSendString函數(shù)控制光盤驅(qū)動器,這個函數(shù)的函數(shù)原型是:
MCIERROR mciSendString(
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
首先在C#中聲明這個函數(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;
或者使用類型強制轉(zhuǎn)換: mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );
或者,使用IntPtr構(gòu)造函數(shù): IntPtr a = new IntPtr(2121);
這里有兩點比較重要:
(1)在C#中聲明Win32API時,一定要按照WinAPI的原型來聲明,不要改變它的數(shù)據(jù)類型;
(2)盡量不要過多使用類型強制轉(zhuǎn)換或構(gòu)造函數(shù)的方式初始化一個IntPtr類型的變量,這樣會使程序變得難于理解并容易出錯。
新聞熱點
疑難解答
圖片精選