Windows下動態鏈結庫與靜態鏈結庫的構建

2021-08-03 07:09:49 字數 2758 閱讀 5154

bool winapi dllmain(handle hdllhandle,dword dwreason,  )

當乙個程式試圖載入解除安裝dll時,系統會呼叫dll庫中的dllmain函式

然後編寫實際功能函式

libiary win32_dll <-模組名稱

exports <-下面的函式才能在dll外使用

fun1

fun2

...

在函式前一句話,如下,表示該函式匯出

__declspec(dllexport) int fun1()

這樣匯出的函式名會被vs修飾,非ms的編譯器無法正確識別函式

新增extern 「c」可以使得函式名就是自己輸入的名字

extern "c" __declspec(dllexport) int fun1()

生成動態鏈結庫時會生成兩個檔案

dll檔案:

1. 儲存**與資源

lib檔案:(不是靜態鏈結庫)

1. 使用的動態鏈結庫的檔名是什麼(此處為win32_dll)

2. 儲存指定函式在dll檔案中的偏移位址

匯入並申明函式

#include 

extern

"c" __declspec(dllimport) int fun1()

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

使用標頭檔案

寫乙個標頭檔案,方便呼叫

win32_dll.h

#include 

#ifdef _mywin32dlltest

extern

"c" __declspec(dllexport) int fun1();

#else

extern

"c" __declspec(dllimport) int fun1();

#pragma comment(lib,"win32_dll.lib") ;

#endif

#undef _mywin32dlltest

然後在win32_dll.cpp引用並定義指定的巨集,在呼叫檔案中引用即可

當只有dll時,可以這樣,但時需要通過某種方法獲得dll中的函式資訊,如反彙編等

#incluce 

typedef

int(*lpfun1)(int,int);//定義乙個函式指標

int main()

freeliberary(hdll);//最後釋放掉這個動態鏈結庫

}

與匯出函式類似,在類的名稱前加上__declspec(dllexport)即可

class __declspec(dllexport) myclass

為方便呼叫,類的標頭檔案可以這麼寫

#include 

#ifdef _mywin32dlltest

#define my_dll_api __declspec(dllexport)

extern "c" __declspec(dllexport) int fun1();

#else

#define my_dll_api __declspec(dllexport)

extern "c" __declspec(dllimport) int fun1();

#pragma comment(lib,"win32_dll.lib") ;

#endif

#undef _mywin32dlltest

class

my_dll_api

myclass

;

我們可以把資源放在dll之中,通過呼叫dll中的某個函式獲得指定資源

hbitmap=(hbitmap)loadimage(mymodule(),makeintresource(103),image_bitmap,0,0,lr_copyfromresourcr);

hrsrc hsrc;

hglobal hexe;

lpvoid lpbuf;

dword dwsize;

dword dwwritten;

//找到乙個資源控制代碼

hsrc=findresourse(mymodule(),makeintresource(104),l」exe」);

//載入資源,獲得資源位址

hexe=laodresourse(mymodule(),hsrc);

//hexe與lpbuf值相同,此句用來檢測該資源是否能被正常鎖定。

lpbuf=loakresource(hexe);

//獲取資源大小

dwsize=sizeofresource(mymodule(),hsec);

//然後就可以對資源進行操作了

hfile=createfile(l」./a.exe」,feneric_all,file_share_read|file_share_write,0,create_always,0,0);

setfilepointer(hfile,0,0,file_begin);

writefile(hfile,lpbuf,dwsize,&dwwritten,0);

closehandle(hfile);

與動態鏈結庫幾乎完全一樣,但沒有dllmain函式

動態鏈結庫使用 靜 動態鏈結庫使用總結

一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...

靜 動態鏈結庫使用總結

編寫方法 visual studio為例 一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num...

動態鏈結庫與靜態鏈結庫

有人會想,動態鏈結這樣麻煩,為什麼還要用呢?這裡有乙個技術問題,對這個問題的解決直接導致了動態載入的需求。問題是有些dll只在某個windows版本中存在,或某個api只在某些windows版本中被加入指定的dll。當你使用靜態鏈結的.exe試圖在不支援的windows版本上執行時,系統會彈出系統對...