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版本上執行時,系統會彈出系統對...