VC dll相關及其C 互動

2021-04-25 08:48:21 字數 1550 閱讀 6842

方法步驟:

1.新建工程:

2.編寫內部**:

該部分過程與建立一般的exe檔案大同小異,在此不再贅述。

3.編寫關鍵**:

在關鍵的標頭檔案中新增dll庫匯出介面:其中匯出類的宣告之前要加註巨集定義afx_ext_class;匯出函式則在生命之前新增extern "c" __declspec(dllexport)的字樣。

4.引入相應的demo程式

demo程式在引用dll時分為靜態和動態兩種:

1>靜態載入:

將相應的dll檔案放入demo.exe的目錄下,將dll編譯生成的lib檔案和包含有匯出介面的關鍵標頭檔案放入程式的編譯目錄下。

而後在用到庫函式的地方#include關鍵標頭檔案,在project---->setting---->link中新增相應的lib檔名稱。執行即可。

2>動態載入:

vc中.dll檔案的動態載入方法:

另附:c#中動態呼叫.dll檔案的方法:

c#慣於利用反射進行動態載入和呼叫.

assembly ass=assembly.loadfrom(dllpath); //利用dll的路徑載入,同時將此程式集所依賴的程式集載入進來,需後輟名.dll

assembly.loadfile 只載入指定檔案,並不會自動載入依賴程式集.assmbly.load無需後輟名

載入dll後,需要使用dll中某類.

type type=ass.gettype(「typename」);//利用型別的命名空間和名稱獲得型別

需要例項化型別,才可以使用,引數可以人為的指定,也可以無引數,靜態例項可以省略

object obj = activator.createinstance(type,params);//利用指定的引數例項話型別

呼叫型別中的某個方法:

需要首先得到此方法

methodinfo mi=type.getmethod(「mehtodname」);//通過方法名稱獲得方法

然後對方法進行呼叫,多型性利用引數進行控制

mi.invoke(obj,params);//根據引數直線方法,返回值就是原方法的返回值

5.注意:如果想實現該dll檔案的跨平台呼叫,比如c#呼叫,則其型別必須是win32以及mfc中的靜態dll,動態dll是不可呼叫的。

以下為c#呼叫非託管.dll方法:

引入相應的命名空間:

using system.runtime.interopservices;

引入dll檔案並宣告匯出函式:

[dllimport("name.dll")]

private static extern style name(/*函式引數表*/);

注意:引入的dll檔案必須是vc中的win32dll或者mfc靜態dll,mfc規則dll和mfc擴充套件dll均是不可用的!!; 除此之外,mfc的三種dll中的前兩種只能用於匯出全域性方法,而第三種只能用於匯出類。

隨後的呼叫便和c#呼叫託管dll檔案相同。

直接引入非託管的dll檔案,之所以會找不到程式的入口,就是因為缺少了宣告匯出函式這至為關鍵的一步。

關於C 呼叫VC DLL

由於在c 呼叫vc的dll檔案不能直接引用,那麼,我們可以通過以下辦法解決。dll檔案分為託管和非託管,在呼叫託管的很好辦,直接被使用的需要引用,間接使用的需要拷貝到bin目錄下.非託管的處理會比較麻煩,實際上,你拷貝到bin沒有任何幫助,因為clr會把檔案拷貝到乙個臨時目錄下,然後在那執行web,...

C 類及其相關

類是一種引用型別,在了解了類的一些基礎知識以後,對一些容易忽略的內容進行總結。1 呼叫基類構造器 作為乙個良好的程式設計習慣,派生類的構造器在執行初始化時,最好呼叫一下它的基類的構造器。為派生類定義構造器時,可以使用base關鍵字來指定呼叫乙個基類的構造器。下例 class mammal class...

C 呼叫VC dll輸出引數

最近做專案需要把以前vc寫的程式整合到vs2005來,用c 寫的,以前vc的動態連線庫寫好了,重寫比較麻煩,讓c 呼叫vc dll就好了。但碰到了乙個問題 vc中作為輸出引數的char 型別的變數應該怎樣申明才能正確輸出資料呢?一般說來,在vc中一般的輸出引數都為指標或陣列的形式,如果是一般型別的指...