首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Visual C++ DLL 動態連結庫實戰:隱式/顯式調用與資料加密完整範例

     編輯:VC 教學

模組重用四大技術對比

技術特點連結方式
函式最基礎模組單位靜態編譯
靜態函式庫函式集合,編譯時鏈入 EXE靜態連結
DLL 動態連結庫執行時載入,多程式共享,節省記憶體動態連結
COM 元件跨語言、跨進程、標準化介面執行時繫結

DLL 載入兩種機制

1. 隱式載入

需求: DLL 編譯產生的 .lib 匯入庫 + .h 標頭檔。

流程: 連結器讀取 .lib 記錄 DLL 名稱與函式入口 → 程式啟動時 OS 自動載入對應 DLL。

DLL 搜尋順序: 程式目錄 → 目前工作目錄 → 系統目錄 → Windows 目錄 → PATH 環境變數目錄。

VC++ 專案加入 .lib 三法:

  1. 專案右鍵 Add Files to Project 選取 .lib
  2. Project Settings → Link → Object/library modules 輸入 .lib 路徑
  3. 原始碼 #pragma comment(lib, "xxx.lib")(支援條件編譯切換 Debug/Release 版本)

加入 .h 並 #include "xxx.h" 即可直接呼叫函式。

2. 顯式載入

適用: 僅有 .dll 檔,無 .lib/.h;或需精確控制載入/卸載時機、節省記憶體。

三步驟 API:

  1. LoadLibrary / AfxLoadLibrary → 取得 HINSTANCE
  2. GetProcAddress → 取得函式指標
  3. 使用完畢 FreeLibrary / AfxFreeLibrary 釋放

實戰案例:共享軟體加密演算法庫

假設第三方提供 Reg.dll,含檔案加密/解密函式:

// 原型
BOOL WINAPI FileEncrypt(LPCTSTR lpInput, LPCTSTR lpOutput, LPCTSTR lpKey, LPCTSTR lpRegCode);
BOOL WINAPI FileDecrypt(LPCTSTR lpInput, LPCTSTR lpOutput, LPCTSTR lpKey, LPCTSTR lpRegCode);

隱式調用(有 Reg.lib + Reg.h)

  1. 專案加入 Reg.lib,標頭檔加入 Reg.h 並 #include "Reg.h"
  2. 直接呼叫 FileEncrypt(...)、FileDecrypt(...)

顯式調用(僅 Reg.dll)

// 加密模組
HINSTANCE hDll = ::LoadLibrary(_T("Reg.dll"));
typedef BOOL (_stdcall *LPFILEENCRYPT)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
LPFILEENCRYPT pEncrypt = (LPFILEENCRYPT)::GetProcAddress(hDll, "FileEncrypt");
if (pEncrypt)
    pEncrypt(srcFile, destFile, password, _T("user-12345678"));
::AfxFreeLibrary(hDll);

// 解密模組
hDll = ::LoadLibrary(_T("Reg.dll"));
typedef BOOL (_stdcall *LPFILEDECRYPT)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
LPFILEDECRYPT pDecrypt = (LPFILEDECRYPT)::GetProcAddress(hDll, "FileDecrypt");
if (pDecrypt)
    pDecrypt(srcFile, destFile, password, _T("user-12345678"));
::AfxFreeLibrary(hDll);

關鍵技術細節

  • WINAPI 宏展開為 __stdcall 呼叫慣例,確保 DLL 與呼叫端堆疊平衡一致。
  • extern "C" 避免 C++ 名稱修飾,確保 GetProcAddress 能依名稱找到函式。
  • Debug/Release 版 .lib 不可混用,#pragma comment 搭配條件編譯最佳。
  • DLL 卸載前必須確認所有函式指標不再使用,避免存取違規。

總結

DLL 為模組重用核心技術,隱式調用開發效率高,顯式調用部署彈性大。善用 DLL 可大幅降低耦合、提升維護性、減少重複造輪子,是大型 C++ 專案架構不可或缺的一環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved