dll 兩種鏈接方式 : 動態鏈接和靜態鏈接(鏈接亦稱加載)
動態鏈接是指在生成可執行文件時不將所有程序用到的函數鏈接到一個文件,因為有許多函數在操作系統帶的dll文件中,當程序運行時直接從操作系統中找。
而
靜態鏈接就是把所有用到的函數全部鏈接到exe文件中。
動態鏈接是只建立一個引用的接口,而真正的代碼和數據存放在另外的可執行模塊中,在運行時再裝入;
而靜態鏈接是把所有的代碼和數據都復制到本模塊中,運行時就不再需要庫了。
1.
生成 靜態鏈接庫
lib 和動態鏈接庫 dll
新建工程 (
newdll) win32項目 -> dll
添加.h文件
betabinlib.h
#ifndef BETABINLIB_H #define BETABINLIB_H #ifdef NEWDLL_EXPORTS //自動添加的宏 右鍵工程-屬性-配置屬性-預處理器-..定義 #define MYDLL_API extern "C" __declspec(dllexport) #else #define MYDLL_API extern "C" __declspec(dllimport) #endif MYDLL_API int add(int x, int y); // 必須加前綴 #endif
添加.cpp文件 betabinlib.cpp
#include "stdafx.h" #include "betabinlib.h" int add(int x, int y) { return x + y; }
編譯生成 .dll 和 .
lib文件
2.
使用
(1)dll的靜態加載--將整個dll文件 加載到 .exe文件中
特點:程序較大,占用內存較大,但速度較快(免去 調用函數LOAD
LIB等)
測試:
需要 .
lib 和 .dll兩個文件 (.
lib 做 引導用),.h文件
main.cpp
#include <stdio.h> #include "betabinlib.h" #include <Windows.h> #pragma comment(lib, "newdll.lib") int main() { printf("2 + 3 = %d \n", add(2, 3)); return 0; }
(2) dll的動態加載--根據需要加載響應函數,隨時可卸載。不會因為找不到dll, 導致程序不能運行(需要自己做判斷處理)。
只需要 .lib文件,不需要 .h文件
main.cpp
#include <stdio.h> #include <Windows.h> int main() { HINSTANCE h=LoadLibraryA("newdll.dll"); typedef int (* FunPtr)(int a,int b);//定義函數指針 if(h == NULL) { FreeLibrary(h); printf("load lib error\n"); } else { FunPtr funPtr = (FunPtr)GetProcAddress(h,"add"); if(funPtr != NULL) { int result = funPtr(3, 3); printf("3 + 3 = %d \n", result); } else { printf("get process error\n"); printf("%d",GetLastError()); } FreeLibrary(h); } return 0; }