C 呼叫DLL學習筆記 動態呼叫

2021-10-05 17:05:14 字數 2390 閱讀 5364

編譯dll時會生成兩個檔案,乙個是lib, 乙個是dll. 注意,此處生成的lib檔案和靜態庫的lib檔案不是乙個東西。

呼叫dll有兩種方式:隱式載入、顯式載入。

一、隱式載入方式

隱式載入方式下,需要3個檔案,分別是dll檔案、lib檔案以及對應的標頭檔案。例paneldata.dll、paneldata.lib、paneldata.h,將上述檔案放入呼叫程式**所在目錄。

呼叫**非常簡單,程式中只需要增加兩行**,以下舉例說明:

#include

#include

"paneldata.h"

//引入標頭檔案

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

//把lib檔案包括進來

intmain()

二、顯式載入方式

顯式載入方式下,呼叫dll檔案只需要為呼叫者提供乙個.dll檔案,以及要呼叫的函式(或類)的名稱和引數,將dll檔案放入呼叫程式**所在目錄。

呼叫有以下步驟:

1、typedef乙個與被呼叫函式型別一致的函式指標。

typedef

int(

*dllfunc)

(double

)//假設被呼叫函式返回值為int, 引數型別為double

在這段**中,dllfunc的型別被定義為:

「乙個指向返回值為int 且 引數型別為double的函式的指標」。

typedef 絕不是像 typedef int integer 這麼簡單——把型別名換個別名。為了深入理解以上**,建議對此知識點另外深入學習。

2、獲得dll檔案的控制代碼。因為是動態呼叫,dll和可執行檔案一起發布,要呼叫dll,必須先獲得它的控制代碼,要用到乙個函式:

hmodule hdll =

loadlibrary

(dllname)

;//hmodule 是windows控制代碼型別,為了使用它,標頭檔案中需包括windows.h

3、定義乙個函式指標,用於指向dll中被呼叫的函式位址,以實現函式功能。

dllfunc dllfunc;

dllfunc =

(dllfunc)

getprocaddress

(hdll,

"paneldata_func1"

);

現在就可以像使用paneldata_func1()一樣來使用dllfunc()了。

最後,別忘了釋放dll控制代碼:

freelibrary

(hdll)

;

完整**如下:

#include

"windows.h"

typedef

int(

*dllfunc)

(double);

intmain()

關於顯式載入的通俗理解

舉乙個簡單的例子,病人到醫院看病,首先要**,拿著**單走進醫院,找到對應科室,向醫生提供各種檢查結果,醫生開藥。

由於機械人技術的發展,病人現在不用大老遠跑到醫院了。只需要網上掛了號,通過機械人把檢查結果發給醫生,醫生就能反饋開藥結果。

在這個過程中,病人不再需要直接和醫院、醫生打交道。但為了通過機械人與醫院取得聯絡,病人首先需要一張合法的**單,通過**單和醫院建立聯絡,醫院就相當於dll檔案,這個**單相當於dll檔案的控制代碼。和醫院取得聯絡後,還要知道科室的位置,需要把科室名稱通過機械人告訴醫院,由醫院返回科室位址。科室名稱就相當於我們要呼叫的函式的名稱,而科室位址就是函式在dll檔案中的位置。與科室取得聯絡後,機械人還不能與科室對話,因為不同科室需要的檢查結果型別不同,有要ct**的,有要驗血結果的,有要血壓血糖的,機械人不知道它應該向病人要什麼,所以機械人首先要知道科室需要什麼型別的檢查結果以及科室開的藥物型別,然後自己實現乙個和科室完全一樣的介面,明確需要的檢查結果及型別,並把這個介面展示給病人。這個人機介面就是我們定義的函式指標。通過這個指標,可以把病人的檢驗結果傳遞給科室醫生,同時能正確接收科室醫生開出的藥物型別,也就是函式的返回型別。看病完畢後,病人要告訴機械人釋放與醫院的連線。

完整梳理概念如下:

醫院——dll檔案

**單——dll檔案控制代碼

科室——函式

人機介面——函式指標

檢查結果型別——函式引數型別

開藥型別——函式返回值型別

獲得科室位置——獲得函式位址

釋放與醫院連線——釋放dll控制代碼

C 動態呼叫DLL

在工作中經常需要寫dll並呼叫。本文寫出一種最簡單實用的dll動態呼叫的demo。口訣 1個檔案2行單詞3步走 dll1個檔案2個單詞 1個檔案.def,2個單詞 export test函式名 exe3步走。申明函式,載入庫,指向函式 1 新建乙個空的exe專案 2 新建乙個空的dll專案,並新增同...

C 呼叫動態DLL

c 呼叫動態鏈結庫方法 dllimport mydll.dll public static extern int add int a,int b private void btn add click object sender,eventargs e 如果需要呼叫同乙個dll檔案中的兩個不同函式,則...

C 動態呼叫DLL

本來是想實現控制台程式執行時自動全屏,但是只找到 vc下的實現方法 其中要使用兩個未公開的 win32 api 函式來訪問控制台視窗,這就需要使用 動態呼叫的方法,動態呼叫中使用的 windows api 函式主要有三個,即 loadlibrary getprocaddress 和freelibra...