新聞中心
handle---------IntPtr

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出??得赓M(fèi)做網(wǎng)站回饋大家。
hwnd-----------IntPtr
char *----------string
int * -----------ref int
int &-----------ref int
void *----------IntPtr
unsigned char *-----ref byte
Struct需要在C#里重新定義一個Struct
CallBack回調(diào)函數(shù)需要封裝在一個委托里,delegate static extern int FunCallBack(string str);
注意在每個函數(shù)的前面加上public static extern +返回的數(shù)據(jù)類型,如果不加public ,函數(shù)默認(rèn)為私有函數(shù),調(diào)用就會出錯。
在C#調(diào)用C++ DLL封裝庫時會出現(xiàn)兩個問題:
1.?dāng)?shù)據(jù)類型轉(zhuǎn)換問題
2.指針或地址參數(shù)傳送問題
首先是數(shù)據(jù)類型轉(zhuǎn)換問題。因?yàn)镃#是.NET語言,利用的是.NET的基本數(shù)據(jù)類型,所以實(shí)際上是將C++的數(shù)據(jù)類型與.NET的基本數(shù)據(jù)類型進(jìn)行對應(yīng)。
例如C++的原有函數(shù)是:
- int __stdcall FunctionName(unsigned char param1, unsigned short param2)
其中的參數(shù)數(shù)據(jù)類型在C#中,必須轉(zhuǎn)為對應(yīng)的數(shù)據(jù)類型。如:
- [DllImport(“ COM DLL path/file ”)]
- extern static int FunctionName(byte param1, ushort param2)
因?yàn)檎{(diào)用的是__stdcall函數(shù),所以使用了P/Invoke的調(diào)用方法。其中的方法FunctionName必須聲明為靜態(tài)外部函數(shù),即加上 extern static聲明頭。我們可以看到,在調(diào)用的過程中,unsigned char變?yōu)榱薭yte,unsigned short變?yōu)榱藆short。變換后,參數(shù)的數(shù)據(jù)類型不變,只是聲明方式必須改為.NET語言的規(guī)范。
我們可以通過下表來進(jìn)行這種轉(zhuǎn)換:
C#調(diào)用VC DLL:轉(zhuǎn)換表
之后再將CLR的數(shù)據(jù)類型表示方式轉(zhuǎn)換為C#的表示方式。這樣一來,函數(shù)的參數(shù)類型問題就可以解決了。
現(xiàn)在,我們再來考慮下一個問題,如果要調(diào)用的函數(shù)參數(shù)是指針或是地址變量,怎么辦?
對于這種情況可以使用C#提供的非安全代碼來進(jìn)行解決,但是,畢竟是非托管代碼,垃圾資源處理不好的話對應(yīng)用程序是很不利的。所以還是使用C#提供的ref以及out修飾字比較好。
同上面一樣,我們也舉一個例子:
- int __stdcall FunctionName(unsigned char ?m1, unsigned char *param2)
在C#中對其進(jìn)行調(diào)用的方法是:
- [DllImport(“ file ”)]
- extern static int FunctionName(ref byte param1, ref byte param2)
看到這,可能有人會問,&是取地址,*是傳送指針,為何都只用ref就可以了呢?一種可能的解釋是ref是一個具有重載特性的修飾符,會自動識別是取地址還是傳送指針。
在實(shí)際的情況中,我們利用參數(shù)傳遞地址更多還是用在傳送數(shù)組首地址上。
如:
- byte[] param1 = new param1(6);
在這里我們聲明了一個數(shù)組,現(xiàn)在要將其的首地址傳送過去,只要將param1數(shù)組的第一個元素用ref修飾。具體如下:
- [DllImport(“ file ”)]
- extern static int FunctionName(ref byte param1[1], ref byte param2)
以上就是C#調(diào)用VC DLL接口函數(shù)參數(shù)類型轉(zhuǎn)換的方法。
文章名稱:C#調(diào)用VCDLL接口函數(shù)參數(shù)類型轉(zhuǎn)換方法介紹
本文路徑:http://www.dlmjj.cn/article/dhcipdg.html


咨詢
建站咨詢
