星期日, 9月 07, 2008

P/Invoke與簡單型別說明

呼叫未受限制程式碼是.NET開發WinCE相當常遇到,原因無他,幾乎所有WinCE硬體開發出的Driver或DLL都是用未受限制的Win32API提供服務,現改寫成.NET DLL的非常少,一方面未受限制的程式效能確實遠遠超過.NET,另一方面敝人認為.NET跳脫原本執行環境Sandbox界線而呼叫未受限公用程式的能力相當強,兩種原因下,系統開法者並不需要特別專為.NET開發DLL。

定義範例如下:

[DllImport ("coredll.dll")]
Private static extern void SetWindowText(IntPtr handle, string s);

以上不詳述dllimport的語法,基本上如此設定便夠應付大部分未受限API。

在使用P/Invoke執行WinCE或Win32API卻發現結果不正確,經常都是函數引數的型別定義不正確,下表為其定義轉換參考:


win32 types specification clr type
char, int8, sbyte 8-bit signed integer system.sbyte
short, short int, int16, short 16-bit signed integer system.int16
int, long, long int, int32, long32, int 32-bit signed integer system.int32
__int64, int64, longlong 64-bit signed integer system.int64
unsigned char, uint8, byte 8-bit unsigned integer system.byte
unsigned short, uint16, ushort, word, atom, __wchar_t 16-bit unsigned integer system.uint16
unsigned, unsigned int, uint32, ulong32, dword32, ulong, dword, uint 32-bit unsigned integer system.uint32
unsigned __int64, uint64, dwordlong, ulonglong 64-bit unsigned integer system.uint64
float, float single-precision floating point system.single
double, long double, double double-precision floating point system.double

最重要的是引述位元數必須相同對應,函數才能正常傳值。

沒有留言: