日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#調(diào)用VCDLL接口函數(shù)參數(shù)類型轉(zhuǎn)換方法介紹

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ù)是:

 
 
 
 
  1. int __stdcall FunctionName(unsigned char param1, unsigned short param2)

其中的參數(shù)數(shù)據(jù)類型在C#中,必須轉(zhuǎn)為對應(yīng)的數(shù)據(jù)類型。如:

 
 
 
 
  1. [DllImport(“ COM DLL path/file ”)]
  2. 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修飾字比較好。

同上面一樣,我們也舉一個例子:

 
 
 
 
  1. int __stdcall FunctionName(unsigned char ?m1, unsigned char *param2)

在C#中對其進(jìn)行調(diào)用的方法是:

 
 
 
 
  1. [DllImport(“ file ”)]
  2. extern static int FunctionName(ref byte param1, ref byte param2)

看到這,可能有人會問,&是取地址,*是傳送指針,為何都只用ref就可以了呢?一種可能的解釋是ref是一個具有重載特性的修飾符,會自動識別是取地址還是傳送指針。

在實(shí)際的情況中,我們利用參數(shù)傳遞地址更多還是用在傳送數(shù)組首地址上。

如:

 
 
 
 
  1. byte[] param1 = new param1(6);

在這里我們聲明了一個數(shù)組,現(xiàn)在要將其的首地址傳送過去,只要將param1數(shù)組的第一個元素用ref修飾。具體如下:

 
 
 
 
  1. [DllImport(“ file ”)]
  2. 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