VC 動態鏈結庫 DLL 程式設計深入淺出 二

2021-05-25 22:12:45 字數 1369 閱讀 1609

上節給大家介紹了靜態鏈結庫與庫的除錯與檢視(動態鏈結庫(dll)程式設計深入淺出(一)),本節主要介紹非 mfc dll。

4.非mfc dll

4.1乙個簡單的dll

圖6 建立乙個非mfc dll

在建立的工程中新增lib.h及lib.cpp檔案,源**如下:

/* 檔名:lib.h */

#ifndef lib_h

#define lib_h

extern "c" int __declspec(dllexport)add(int x, int y);

#endif

/* 檔名:lib.cpp */

#include "lib.h"

int add(int x, int y)

#include

#include

typedef int(*lpaddfun)(int, int); //巨集定義函式指標型別

int main(int argc, char *argv)

freelibrary(hdll);

}return 0;

}分析上述**,dlltest工程中的lib.cpp檔案與第2節靜態鏈結庫版本完全相同,不同在於lib.h對函式add的宣告前面新增了__declspec(dllexport)語句。這個語句的含義是宣告函式add為dll的匯出函式。dll內的函式分為兩種:

(1)dll匯出函式,可**用程式呼叫;

(2) dll內部函式,只能在dll程式使用,應用程式無法呼叫它們。

而應用程式對本dll的呼叫和對第2節靜態鏈結庫的呼叫卻有較大差異,下面我們來逐一分析。

首先,語句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模組。

通過這個簡單的例子,我們獲知dll定義和呼叫的一般概念:

(1)dll中需以某種特定的方式宣告匯出函式(或變數、類);

(2)應用工程需以某種特定的方式呼叫dll的匯出函式(或變數、類)。

下面我們來對「特定的方式進行」闡述。

VC 動態鏈結庫 DLL 程式設計深入淺出 一

1.概論 先來闡述一下dll dynamic linkable library 的概念,你可以簡單的把dll看成一種倉庫,它提供給你一些可以直接拿來用的變數 函式或類。在倉庫的發展史上經歷了 無庫 靜態鏈結庫 動態鏈結庫 的時代。2.靜態鏈結庫 對靜態鏈結庫的講解不是本文的重點,但是在具體講解dll...

VC 動態鏈結庫 DLL 程式設計深入淺出 二

4.2 宣告匯出函式 dll 中匯出函式的宣告有兩種方式 一種為4.1節例子中給出的在函式宣告中加上 declspec dllexport 這裡不再舉例說明 另外一種方式 是採用模組定義 def 檔案宣告,def檔案為鏈結器提供了有關被鏈結程式的匯出 屬性及其他方面的資訊。下面的 演示了 怎樣同.d...

VC 動態鏈結庫 DLL 程式設計深入淺出 一

1.概論 先來闡述一下dll dynamic linkable library 的概念,你可以簡單的把dll看成一種倉庫,它提供給你一些可以直接拿來用的變數 函式或類。在倉庫的發展史上經歷了 無庫 靜態鏈結庫 動態鏈結庫 的時代。圖1 建立乙個靜態鏈結庫 並新建lib.h和lib.cpp兩個檔案,l...