關於c 互操作呼叫C Dll多級指標乙個想法。

2022-03-02 10:11:22 字數 2382 閱讀 9840

在c#呼叫c dll互操作中,c dll中的函式可能會有些多級指標作為引數或者返回值的情況,

本文的目的就是提供一種安全情況下,.net對於c dll的呼叫想法,之所以叫想法,是因為這個方法

首先,關於.net(c#)如何呼叫c dll的基本方法,詳見此文。

我的環境為vs2015 community版本。

首先建立在你的解決方案新增兩個控制台專案,它們分別為乙個c#,c++控制台:

其中c++控制台專案建立時請選擇控制台的dll專案.而非預設的控制台專案。

在你的c++控制台專案中新增兩個檔案:mydll.cpp,mydll.h,內容如下:

mydll.cpp

#include "stdafx.h"

#include "mydll.h"//貌似這兩個標頭檔案的順序不能顛倒。我試了很多次,但是不能確定。

#include "stdlib.h"

int statenum = 0;//全域性狀態量。

//mystruct定義在mydll.h中

/*以下為五種級別的結構體指標函式定義*/

mystruct getstruct(mystruct st)

mystruct* getstruct1(mystruct *st)

mystruct** getstruct2(mystruct **st)

mystruct*** getstruct3(mystruct ***st)

mystruct**** getstruct4(mystruct ****st)

mydll.h如下:

#ifndef lib_h

#define lib_h

typedef struct mystruct mystruct;

extern "c" _declspec(dllexport) mystruct  getstruct(mystruct st);

extern "c" _declspec(dllexport) mystruct*  getstruct1(mystruct *st);

extern "c" _declspec(dllexport) mystruct**  getstruct2(mystruct **st);

extern "c" _declspec(dllexport) mystruct***  getstruct3(mystruct ***st);

extern "c" _declspec(dllexport) mystruct****  getstruct4(mystruct ****st);

#endif

c#專案program.cs編輯如下;

using system;

using system.runtime.interopservices;

namespace cdllinvoker

class program

return ptr;

}catch (exception ex)

}//其中level為傳入指標的級別;

其中,值得注意的是,當呼叫指標級別大於2時,有可能會出項錯誤,具體原因尚不清楚:

這裡我推薦的方法是,若當你所需要的指標級別大於3時,請使用ref+低一級的指標,

以減少出現上述錯誤的可能。

比如若你想使用如上的mystruct*** getstruct(mystruct ***st);

你可以使用如下的方法; 

var  ptr = getptrfromstructure(st, 2);

getstruct3(ref ptr);

st = getstructurefromptr(ptr, 2);

console.writeline(st.myval);

當然,在program.cs中定義的getstruct3方法也需要改變引數為ref intptr;

在乙個解決方案中用C 測試呼叫C DLL

vs2015,在解決方案中新建乙個c dll專案,乙個c winform專案 這個是自動生成 case dll x x,這幾個是dll訊息 stdafx標頭檔案和c檔案不用管 dlltest2.cpp裡面新增3個函式 include stdafx.h include dlltest2.h inclu...

C 呼叫操作Excel的乙個類

在這兒本來想寫長一點的文章,但因為時間的關係,沒有寫成。現把自己做的乙個小東西,c 呼叫excel作報表的源 放在這兒給大家看看。關於 的構成,在源 中已經有完整的 注釋了,這兒就不說什麼了。下面的這個類中,主要完成的功能是從資料庫 中逐字段讀出資料,設定格式後,在excel中顯示出來。這是它執行後...

C 呼叫操作Excel的乙個類

在這兒本來想寫長一點的文章,但因為時間的關係,沒有寫成。現把自己做的乙個小東西,c 呼叫excel作報表的源 放在這兒給大家看看。關於 的構成,在源 中已經有完整的 注釋了,這兒就不說什麼了。下面的這個類中,主要完成的功能是從資料庫中逐字段讀出資料,設定格式後,在excel中顯示出來。這是它執行後的...