VC 寫Dll和呼叫

2021-09-30 11:01:36 字數 1851 閱讀 2554

先轉過來 下來再看

(一)寫addtest.dll

1.新建乙個project->win32 dynamic link library,命名為addtest, finish.

2.新建乙個c/c++ head file,命名為summath.h,其**為:

extern "c" __declspec(dllexport) 

int fun(int x1,int x2,int x3);

3.新建乙個summath.cpp,其**為:

#i nclude "addmath.h"

extern "c" __declspec(dllexport) int fun(int x1,int x2,int x3)

4.儲存,build,這樣我們就在addtest工程目錄下的debug檔案中得到addtest.dll檔案。

分析上面的程式我們可以看出,對dll的呼叫分為一下幾步:

首先,語句typedef int ( * lpaddfun)(int,int)定義了乙個與add函式接受引數型別和返回值均相同的函式指標型別。隨後,在main函式中定義了lpaddfun的例項addfun;

其次,在函式main中定義了乙個dll hinstance控制代碼例項hdll,通過win32 api函式loadlibrary動態載入了dll模組並將dll模組控制代碼賦給了hdll;

再次,在函式main中通過win32 api函式getprocaddress得到了所載入dll模組中函式add的位址並賦給了addfun。經由函式指標addfun進行了對dll中add函式的呼叫;

最後,應用工程使用完dll後,在函式main中通過win32 api函式freelibrary釋放了已經載入的dll模組。

在上面的例子中我們看到了由系統api提供的三位一體「dll載入-dll函式位址獲取-dll釋放」方式,這種呼叫方式稱為dll的動態呼叫。

動態呼叫方式的特點是完全由程式設計者用 api 函式載入和解除安裝 dll,程式設計師可以決定 dll 檔案何時載入或不載入,顯式鏈結在執行時決定載入哪個 dll 檔案。

同樣,還存在靜態呼叫的方式。靜態呼叫方式的特點是由編譯系統完成對dll的載入和應用程式結束時 dll 的解除安裝。當呼叫某dll的應用程式結束時,若系統中還有其它程式使用該 dll,則windows對dll的應用記錄減1,直到所有使用該dll的程式都結束時才釋放它。靜態呼叫方式簡單實用,但不如動態呼叫方式靈活。

下面我們來看看靜態呼叫的例子,將編譯dlltest工程所生成的.lib和.dll檔案拷入dllcall工程所在的路徑 

(二)在另外乙個console程式中呼叫addtest.dll

2.新建乙個test.cpp檔案。其**為:

#i nclude

#i nclude

//---------1、動態呼叫類庫--------------------------------------------

typedef int (_cdecl *dlladdmath)(int,int,int); 

//宣告乙個函式指標,可以指向dll中的函式

//2、靜態呼叫類庫

#pragma comment(lib,"addtest.lib")

extern "c"__declspec(dllimport) int fun1(int x,int y);

int main()

這個時候儲存,並執行,就會看到結果為:

測試vc中使用dll的結果為:6

(三)在c#中呼叫

在引用中新增addtest.dll

using addtest;

private void button2_click(object sender, eventargs e)

public static class addtest

DELPHI呼叫VC寫的DLL經驗

由於專案的需要,必須使用delphi呼叫vc編寫的dll,而我是編寫dll的。這裡總結幾個出現過的問題,以後再遇到就會用了。一 需要在每乙個輸出的函式開始新增上 afx manage state afxgetstaticmodulestate 這是用來實現dll資源的切換!讓我們來看看,這句 到底做...

VC動態呼叫DLL

1.生成dll extern c declspec dllexport char sendmess char buffer,int length 呼叫的時候要先給buffer分配記憶體 new 不然會出10014的錯誤.10014 系統檢測到在乙個呼叫中嘗試使用指標引數時的無效指標位址。2.動態呼叫...

利用vc呼叫dll

一時興起,研究下關於dll的呼叫,算是作為我首次發表文章啦,怎麼說也是我的處子作啊 好吧入正題啦 關於dll的呼叫,查了下資料,有兩種 一 靜態呼叫 二 動態呼叫,下面是分別的呼叫方法 一 靜態呼叫 3 用vc開啟mytest工程,選中工程,然後選擇vc選單下的project settings 二 ...