C 呼叫C 動態鏈結庫中的函式指標與函式指標結構

2021-05-04 09:54:56 字數 1880 閱讀 3503

c#呼叫c++動態鏈結庫中的函式指標與函式指標結構 [ http://www.dreamdu.com/blog/2008/04/25/cs_cpp_functionpointer/ ] ...這幾天做專案時,遇到了c#呼叫c++函式指標的問題,c#呼叫c++ dll中的函式很簡單,函式指標還真沒調過,看了幾篇文章研究了會兒後把問題搞定了,這裡總結一下。

先看兩篇文章:

http://jc.nfxxw.com/n/200607/14/n20060714_19510.shtml c#中的函式指標 (實在是找不到出處了)

http://dev.csdn.net/article/69/69261.shtm 如何在c#中使用 win32和其他庫 (這篇我在msdn上找了半天也沒找到!)

函式指標搞c++的人應該都知道,效率高,易用性強,隱蔽**等。在c++裡面呼叫c++寫的dll的函式指標那是在容易不過了。使用c#就稍微麻煩點了!那怎麼掉呢?通過上面的第一篇文章我們知道應該使用委託 delegate。如果再高階點,定義乙個函式指標結構(有點像linux的核心),也同樣可以用c#呼叫。

下面我只寫出了.h和.cs檔案,都是偽**,大家如果能明白意思,可以很簡單的用到自己的專案了。

.h檔案

// 獲得夢之都**的ip pdes  -  夢之都的** http://www.dreamdu.com/// 返回值 - false 獲取失敗 true 獲取成功typedef bool (*dreamdu_pgetip)(char const* pdes) ; // 獲得可愛的猴子的名字 pdes  -  可愛的猴子的名字 http://www.dreamdu.com/blog/// 返回值 - false 獲取失敗 true 獲取成功typedef void (*monkey_pgetname)(char const* pdes) ; // 夢之都的函式指標結構struct dreamdu_struct ;// 獲取夢之都的函式指標結構的函式指標// pdreamdu  -  夢之都的函式指標結構陣列typedef void (*dreamdu_pgetdreamdustruct)(dreamdu_struct *pdreamdu) ;// 獲取夢之都函式指標結構的函式 這個就是輸出函式啦 哈哈// pdreamdu  -  函式指標結構陣列extern "c" dreamdu_dll_ext_ void dreamdu_getdreamdustruct(dreamdu_struct *pdreamdu) ;
.cscs檔案

public class dreamdu//裝載 dllpublic static void loaddll(string lpfilename)//獲得函式指標public static void loadfun(string lpprocname)finally}//解除安裝 dllpublic static void unloaddll()public static bool getip(string name)public static void getname(string name)private static intptr hmodule = intptr.zero;private static getdreamdufuns dreamdustruct = null;private static fundreamdustruct func = new dreamdu_struct();private static intptr pcon = intptr.zero;}
上面的c#介面就已經封裝好了,仔細觀察getdreamduaddress函式kernel32.dll中此函式是返回farproc指標的,但是在這裡我重新定義了乙個委託來獲取函式指標。

上面的c#介面就已經封裝好了,可以使用下面方式呼叫。

class dreamdudll//使用完了別忘了解除安裝dlldreamdu.unloaddll();}

...

C 呼叫C 動態鏈結庫dll

在過程中發現兩種方法解決問題 一種是非託管c 建立的dll庫,需要用靜態方法呼叫。這種方法無法在c 的reference中直接引用,而是要用靜態呼叫的方法,其他部落格已經介紹的很詳盡,唯一需要補充的是,c 檔案需要先 usingsystem.runtime.interopservices 之後才可以...

Python呼叫C 動態鏈結庫

1 安裝vs2010,或者以上的版本 2 建立win32應用程式,應用程式型別選擇dll。由於python是64位的,因此需要將win32程式設定為x64,即64位的。3 編寫程式add.cpp 4 編寫標頭檔案add.h。由於 比較少,也可以申明直接放在add.cpp中,此處為了規範,還是分開寫的...

C 生成 呼叫動態鏈結庫

一 需求描述 1 用 生成動態鏈結庫 2 用c 呼叫動態鏈結庫 二 生成動態鏈結庫 1 新建類庫 2 新增welcomeinfo類 如下 僅供測試用,例子很簡單 1 using system 2using system.collections.generic 3using system.linq 4...