動態連結庫dll的 靜態載入 與 動態載入
阿新 • • 發佈:2019-01-07
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
編譯生成 .dll 和 . lib檔案 2. 使用 (1)dll的靜態載入--將整個dll檔案 載入到 .exe檔案中 特點:程式較大,佔用記憶體較大,但速度較快(免去 呼叫函式LOAD LIB等) 測試: 需要 . lib 和 .dll兩個檔案 (. lib 做 引導用),.h檔案#include "stdafx.h" #include "betabinlib.h" int add(int x, int y) { return x + y; }
main.cpp
(2) dll的動態載入--根據需要載入響應函式,隨時可解除安裝。不會因為找不到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; }
#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;
}