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

VC++ DLL 編程深度解析(一):從靜態庫到動態鏈接庫的核心概念

     編輯:VC++

系列目標:系統掌握 DLL 設計、導出/導入、調試、部署全流程

1. 庫的演進:無庫 → 靜態庫 → 動態庫

階段特點缺點
無庫所有代碼編譯進單一 EXE代碼複用難、編譯慢、體積大
靜態庫.lib 鏈接時合併進 EXE多 EXE 佔用重複代碼、更新需重新鏈接、不能包含 DLL
動態庫.dll 運行時加載,進程間共享部署依賴、版本地獄、加載性能開銷

2. DLL 三大核心特性

  1. 語言無關性:遵循 C 調用約定(extern "C" + __stdcall),VB、C#、Delphi、Python 皆可調用。
  2. 系統無處不在:kernel32.dll (內存/進程)、user32.dll (UI)、gdi32.dll (繪圖) 構成 Windows API 基石。MessageBox 即導出自 user32.dll。
  3. VC++ 三類 DLL:
    • Non-MFC DLL:純 C/C++,無 MFC 依賴,通用性最強。
    • MFC Regular DLL:靜態/動態鏈接 MFC,導出 C 接口,可被非 MFC 調用。
    • MFC Extension DLL:動態鏈接 MFC,導出 MFC 類(CObject 派生),僅限 MFC 應用調用。

3. 靜態庫速成:建立「庫」的直觀認知

創建步驟:

  1. New Project → Win32 Static Library → 名稱 LibMath。
  2. 添加 Math.h / Math.cpp:

// Math.h
#ifndef MATH_H
#define MATH_H
extern "C" int Add(int a, int b); // C 鏈接,防止名稱修飾
#endif

// Math.cpp
#include "Math.h"
int Add(int a, int b) { return a + b; }
  1. 編譯產出 LibMath.lib。

調用方使用:


// 方法 1:#pragma 指定庫路徑
#pragma comment(lib, "..\\Debug\\LibMath.lib")
#include "Math.h"
int main() { printf("%d", Add(2,3)); }

// 方法 2:項目屬性 → Linker → Additional Dependencies 添加 LibMath.lib
//           → Additional Library Directories 添加.lib 目錄

4. DLL 調試與查看工具

  • 調試:DLL 無法直接運行。VS 中:屬性 → Debugging → Command 設置調用方 EXE 路徑,或 同一 Solution 包含 DLL + EXE 專案,在 EXE 調用處 F11 步入 DLL 代碼。
  • 查看導出表:Depends.exe (Dependency Walker) 打開 DLL,紅框顯示導出函數、序號、裝飾名稱。系統 DLL 同理可查。

Depends 查看 user32.dll 導出

5. 本系列規劃

  1. 非 MFC DLL:導出函數/變量/類、調用約定、.def 文件、動態/靜態加載、DllMain
  2. MFC Regular DLL:創建向導、資源模塊狀態切換 (AFX_MANAGE_STATE)
  3. MFC Extension DLL:導出 CObject 派生類、CDynLinkLibrary 機制
  4. 進階:版本管理、延遲加載、側邊組件、安全加載庫

建議:每節必動手建專案,對照 Depends 查看導出表,用調試器步入 DllMain 與導出函數。

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