乙個客戶要使用c#呼叫我們用c++開發的乙個動態鏈結庫,本來我沒有c#的開發經驗,就隨便寫了乙個例程。以為很簡單就可以搞定,沒想到客戶開發的過程中遇到了不少問題,最困難的就是用c#呼叫c++介面中的自定義資料型別的陣列作為引數的情況了,解決完問題,總結如下。
dll介面定義如下:
這裡pdincaninfo是有3個dincan_info元素陣列的指標,其中readdincaninfo中的pdincaninfo需要作為out引數,writedincaninfo需要作為in引數,這兩種使用形式在c#中的呼叫方法也不太一樣。
c#呼叫readdincaninfo關鍵**如下:
dincan_info
dininfo = new
dincan_info();
intsize = marshal.sizeof(typeof(dincan_info)) * 3;
byte bytes = new
byte[size];
intptr
pbuff = marshal.allochglobal(size);
dincan_info pdinfo = new
dincan_info[3];
if (readdincaninfo(1811422176, pbuff)) //引數一為卡內碼
marshal.freehglobal(pbuff);
messagebox.show("讀取訂餐資訊成功");
} c#呼叫writedincaninfo關鍵**如下:
dincan_info
dininfo = new
dincan_info();
dininfo.iyear =convert.touint32( datetime.now.year);
dininfo.imonth = convert.touint32( datetime.now.month);
dininfo.iday = convert.touint32( datetime.now.day);
dininfo.itype = 1;
dininfo.imeal = 1;
dininfo.btaked = false;
intsize = marshal.sizeof(typeof(dincan_info)) * 3;
byte bytes = new
byte[size];
intptr
pbuff = marshal.allochglobal(size);
dincan_info pdinfo = new
dincan_info[3];
long
ptr = pbuff.toint64();
for (int
i = 0; i
< 3; ++i )
if (writedincaninfo(1811422176, pbuff)) // 引數一為卡內碼
**看起來比較麻煩,要參考的抄以上**了,主要思想就是申請一塊記憶體,在申請的這塊記憶體中構建陣列物件,然後將這個記憶體位址作為pdincaninfo進行呼叫。兩個函式的區別就是如何將記憶體按定義的資料結構進行解析的區別。
C 呼叫C C 動態庫 封送結構體,結構體陣列
一.結構體的傳遞 cpp define jnaapi extern c declspec dllexport c方式匯出函式 typedef struct osinfo 1.獲取版本資訊 傳遞結構體指標 jnaapi bool getversionptr osinfo info 2.獲取版本資訊 傳...
c c 結構體呼叫
1 最近做專案遇到,c 呼叫c dll裡的函式需要傳遞結構體引數,發現這個並不是簡單的在c 裡定義相應的結構體就可以的,下面以乙個例子來說明解決的辦法,c 中的函式和結構體如下 uint msec set igr gen cfg int port,igr gen t igr gen typedef ...
c c結構體陣列 結構體指標
結構體中自己常常弄不清的。兩個常用的結構體陣列 結構體指標 將自定義的結構體放入到陣列中方便維護 語法 語法 struct 結構體名 陣列名 元素個數 舉例 struct student intmain for int i 0 i 3 i 2 結構體指標 顧名思義就是指向結構體的乙個指標 通過指標訪...