DLL入門指南

2021-09-13 03:53:45 字數 2895 閱讀 8843

什麼是dll檔案

dll 的全稱叫:動態鏈結庫程式,是為可執行檔案服務的,每個 dll 中有諸多的函式供可執行檔案主體呼叫!在linux下的表現形式為 .so 檔案。dll 檔案與 .exe 可執行檔案同屬於 pe 檔案型別,與 .exe 檔案不同的是:dll檔案需要有重定位表以及匯出表而 .exe 檔案不一定需要。與 dll 對應的是靜態鏈結庫,通常是 .a 檔案

為什麼需要dll

怎麼鏈結dll

編寫前的準備

dll 的編寫特別要注意你的編譯器選擇,我目前也只用了兩個主流的編譯器做過測試,乙個是微軟 visualstudio 自帶的msvc編譯器,另乙個是 gnu 在 windows 上的mingw編譯器

如果你使用 mingw,那麼和寫普通程式區別不大;但如果你使用 msvc 的話,你就需要注意一些固定的格式,以及一些巨集定義

msvc版

直接新建乙個 dll 檔案專案,先寫乙個標頭檔案,把一些變數和函式的定義寫好,這裡有興趣的話可以了解一下#ifdef以及extern "c" __declspec(dllimport),標頭檔案 header.h **如下

#ifdef mylibapi

#define mylibapi extern "c" __declspec(dllexport)

#else

#define mylibapi extern "c" __declspec(dllimport)

#endif

mylibapi int res;

mylibapi int myadd(int num1,int num2);

然後是主要的功能**,mydll.c **如下

#include #define mylibapi extern "c" __declspec(dllimport)

#include "header.h"

int res;

int myadd(int num1,int num2)

注意事項:

extern "c"主要是排除 c++ 編譯的干擾,c++ 編譯某個函式後會變成 func@ 的形式,不方便主程式根據函式名呼叫

__declspec(dllimport)從其它動態庫中宣告匯入函式、類、物件等供本動態庫或exe檔案使用,在沒有全域性靜態變數時可以不使用該關鍵字

__declspec(dllexport)宣告為匯出函式、類、物件等供其它程式呼叫,如果不使用該關鍵字匯出 dll 函式,則需要 .def 檔案

mingw版

使用 mingw 編譯器的話和寫普通程式類似,只寫需要用到的函式即可,不需要 main 主函式,然後編譯成 dll 檔案即可。編譯一句搞定gcc math.c -shared -o math.dll -wl,--out-implib,math.lib,--output-def,math.def,還能生成 .lib 以及 .def 檔案,用 c++ 的話可能還需要--kill-at,mydll.c **如下:

#includeint add(int a,int b)

int sub(int a,int b)

int mul(int a,int b)

int div(int a,int b)

// gcc math.c -shared -o math.dll -wl,--out-implib,math.lib,--output-def,math.def

注意:dll 程式其實也是有入口函式的-dllmain,作業系統在呼叫 loadlibrary() 執行緒的上下文中呼叫此入口函式,並且入口函式中通常會說明該 dll 被呼叫的方式!除非有特殊需求,一般不需要寫 dllmain 函式

顯式鏈結呼叫

呼叫之前 msvc 生成的 mydll_vc.dll 中的函式

#include #include int main()

myadd = (int (*)(int,int))getprocaddress(hmydll,"myadd");

printf("%d\n",myadd(99,999));

return 0;

}

呼叫之前 mingw 生成的 mydll_gcc.dll 中的函式

#include #include #include typedef int (*addfunc)(int,int);

typedef int (*subfunc)(int,int);

typedef int (*mulfunc)(int,int);

typedef int (*divfunc)(int,int);

int main()

if(sub != null)

if(mul != null)

if(div != null)

}else

freelibrary(hdll);

system("pause");

return 0;

}

隱式鏈結呼叫

在**中新增#include "..\mylib\mylib.h" 以及 #pragma comment(lib,"mylib.lib"),並把相應的 dll 檔案放在**的目錄下,然後直接使用函式即可!

python入門指南 Python 入門指南

python 入門指南 release 3.6.3 date dec 10,2017 python 是一門簡單易學且功能強大的程式語言。它擁有高效的高階資料結構,並且能夠用簡單而又高效的方式進行物件導向程式設計。python 優雅的語法和動態型別,再結合它的解釋性,使其在大多數平台的許多領域成為編寫...

DLL初學者指南

這裡有兩個方法來載入乙個dll 乙個方法是捷徑另乙個則相比要複雜些。捷徑是只鏈結到你.lib 檔案並將.dll檔案置入你的新專案的路徑中去。因此,建立乙個新的空的win32控制台專案並新增乙個原始檔。將你做的dll放入你的新專案相同的目錄下。include include declspec dlli...

DLL初學者指南

dll初學者指南 dll project的源 及測試專案 原文出處 codeguru 我正在學習dlls,談不上對其有什麼高屋建瓴的見解 本文只是 通過 編碼讓你看到並想知道 是如何執行的。在本文中,我假定你知道如何使用你的編譯器特性,比如設定目錄路徑等等。ifndef dll tutorial h...