因為是C#,所以平台肯定是.NET了。
之前因為一個小小的業務需要接觸了下密碼鍵盤的操作。其實就是簡單的擷取使用者輸入密碼的操作,沒碰到什麼大的問題,但是查資料的過程中還是感覺查到的東西挺多的,是那種越查越多,但是又不是很關鍵的東西。
在調用DLL中的方法的時候,我們一般要對照函數說明來把C/C++中的類型轉換為.NET中相對應的類型,而且方法必須聲明為靜態外部函數,即加上public extern static聲明頭.如果不加public ,函數預設為私人函數,調用就會出錯。
[DllImport("COM DLL path/file")]public extern static int FunctionName(byte param1, ushort param2)
類型對照表:
Win32 Types |
CLR Type |
char, INT8, SBYTE, CHAR |
System.SByte |
short, short int, INT16, SHORT |
System.Int16 |
int, long, long int, INT32, LONG32, BOOL , INT |
System.Int32 |
__int64, INT64, LONGLONG |
System.Int64 |
unsigned char, UINT8, UCHAR , BYTE |
System.Byte |
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t |
System.UInt16 |
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT |
System.UInt32 |
unsigned __int64, UINT64, DWORDLONG, ULONGLONG |
System.UInt64 |
float, FLOAT |
System.Single |
double, long double, DOUBLE |
System.Double |
對於普通的函數調用一般類型對應上就沒什麼問題了,但是對於涉及到指標操作和回調操作的就會複雜一些,當然熟悉了也就不複雜了,這裡只涉及指標的操作。如果DLL中有一個函數的傳人蔘數是一個指標的話,如:int __stdcall FunctionName(unsigned char *param2)這就當是DLL的一個函數說明,傳回值是INT,傳入參數是一個指標,類型是unsigned char。對於CHAR和STRING類型的區別本來找到個說的比較好的文章,但是回到家裡後就找不到那文章了。他們的區別就是字元和字串的區別,char 聲明並賦值的時候只能是單字元的,char c = 'c';而string聲明和賦值的時候可以是單字元也可以是很多個單字元連在一起組成一個串,string s = "cc";C/C++在表示字串的時候是以字元數組來表示的,char[] c;在調用包括指標操作的函數的時候,除了對照類型,我們還得考慮採用的處理方式。 “對於這種情況可以使用C#提供的非安全的程式碼來進行解決,但是,畢竟是Unmanaged 程式碼,垃圾資源處理不好的話對應用程式是很不利的。所以還是使用C#提供的ref以及out修飾字比較好。”非安全的程式碼是.NET為了指標操作的需要而特別設定的功能,所以既然是針對指標而留的,那應該也是最合適的處理方法了。後面試了下ref的方式,提示執行個體的異常,也許是指標傳的不對,找不到對象了。
使用:已密碼鍵盤擷取密碼輸入為例
函數說明:int __stdcall inputpassword(unsigned char *param)
.NET中使用:
聲明:
[DllImport("COM DLL path/file")]
unsafe public static extern int inputpassword(byte* param);這裡我們用BYTE對應char*
調用:放在哪裡自己決定
byte[] password = new byte[6];\\密碼鍵盤輸入為6位,所以長度設為6就可以了
unsafe
{
//fixed的MSDNhttp://msdn.microsoft.com/zh-cn/library/f58wzh21(VS.80).aspx
fixed(byte* array=password ) //這裡擷取的是password 的地址,並FIX,就是固定“fixed 語句禁止記憶體回收行程重定位可移動的變數”
{
int ret_value = inputpassword(array);//這裡傳入的是指標,因為unsigned char *param就是一個指標。
}
}
語句執行後的結果是輸入的密碼會儲存在password 位元組數組中,之後就是調用相應的方法把password 轉換成6位密碼字元了。