1. 程式人生 > >c++中dll的編寫和呼叫

c++中dll的編寫和呼叫

1. 什麼是dll

DLL(Dynamic Link Library)即動態連結庫,DLL檔案與EXE檔案一樣也是可執行檔案,但是DLL也被稱之為庫,因為裡面封裝了各種類啊,函式啊之類的東西,就像是一個庫一樣,儲存著很多東西,主要是用來呼叫的。一個應用程式可使用多個DLL檔案,一個DLL檔案也可能被不同的應用程式使用,這樣的DLL檔案被稱為共享DLL檔案。

當程式需要呼叫DLL所定義的功能時,需要先載入DLL檔案,然後取得函式的地址,最後進行呼叫。

 呼叫方式主要分為兩種:隱式(通過lib檔案與標頭檔案) 與 顯式(只通過DLL檔案)。
DLL檔案是Windows作業系統下定義的檔案,可被多種語言呼叫。
通過DLL來呼叫功能,可實現程式碼的封裝與複用,去除功能之間的耦合,有利於模組化。降低應用難度的同時,也可以實現智慧財產權的保護。 

 

2. dll 在vs2015怎麼編寫

1.首先建立一個空的DLL檔案,建立方法:新建——專案——Win32控制檯程式——然後取個名字——確定——下一步——選擇DLL——勾選空白專案。順利新建了專案。

2.然後我們在標頭檔案下建立一個頭檔案這裡我們是DLL1.h,輸入如下程式碼:

 

  (二)回顧一下VC++支援的DLL:
  DLL的編制與具體的程式語言及編譯器無關,動態連結庫隨處可見,VC++支援三種DLL:非MFC動態庫、MFC規則DLL和MFC擴充套件DLL。DLL匯出函式(或變數、類)可供應用程式呼叫;DLL內部函式只能在DLL程式內使用,應用程式無法呼叫它們。
  
  (三)匯出函式的宣告方式:
 1) 一種在函式宣告型別和函式名之間加上“_declspec(dllexport)”。

、定義需要用到的標頭檔案和原始檔

// header.h

       __declspec(dllexport) int  add(int a ,int b);//add是函式名,可宣告多個


       __declspec(dllexport) int  sub(int a ,int b);

       // 如果是c++工程,則需要在函式宣告前加上extern “C”

       extern “C”  __declspec(dllexport) int  add(int a ,int b);
       extern “C”  __declspec(dllexport) int  sub(int a ,int b);
//  src.cpp
      int __declspec(dllexport) add(int a ,int b){

            return a+b;
      }

      int __declspec(dllexport) sub(int a, int b){

            return a-b;
      }

反覆嘗試終於成功了,雖然很初級,但是還是要Mark一下。文章由參考

    int result = dbOper.verifyuser("Abc", "cd", "c##scott", "tiger", "orcl", "12");

連線(1)https://msdn.microsoft.com/zh-cn/library/ms235636(v=vs.120).aspx

只不過此文是在同一個工程下的不同專案之間進行dll呼叫,故仍有不同。

首先1.生成dll

生成的方式可以完全參考上面的連線。主要步驟為:1)新建專案C++/Win32控制檯應用程式,命名,注意生成的是dll專案,本測試沒有選擇到處符號複選框,跟上面連結一樣,但是在debug裡面還是會有dll生成。2)編輯.h和.cpp檔案。3)生成解決方案。這三步均按照上面的連線。4)將上述生成的debug內的dll,lib以及與dll同名的.h檔案拷到某個位置,要記得哦,我放到include資料夾。

2.呼叫dll

很多網上的介紹都很複雜,各種配置。。這裡似乎沒那麼複雜

主要步驟:1)新建專案C++/Win32控制檯應用程式,命名。

2)選擇沒有預編譯頭

3)呼叫dll內的類函式,可以參照上面連結中的cpp檔案

4)生成解決方案,現在肯定是很多錯誤,表捉急

5)將上面儲存的檔案中的.h放在你編輯的.cpp同文件夾下

6)將dll和lib檔案拷貝到debug資料夾下,與exe檔案是同一個資料夾

7)右鍵專案名字選擇屬性,->配置屬性->VC++目錄->常規-庫目錄,選擇你放置了lib的debug資料夾

8)->配置屬性->聯結器-輸入-附加依賴項-編輯加入lib的檔名(全名包含字尾)-確認

9)重新生成,執行即可
 

 2) 另外一種採用模組定義(.def)檔案宣告,需要在庫工程中新增模組檔案,格式如下:
  LIBRARY 庫工程名稱
  EXPORTS 匯出函式名