萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> 程式語言綜合

VC++ 6.0 建立與呼叫動態連結庫(DLL)完整教學

本文詳細說明 VC++ 6.0 環境下靜態/動態連結庫的差異、DLL 類型、導出方式、呼叫模式與完整實作範例。

靜態庫 vs 動態庫

特性靜態庫 (.lib)動態庫 (.dll)
程式碼包含方式直接鏈接進 EXE執行時動態載入/卸載
可包含其他庫不可可包含靜態/動態庫
部署單一 EXE需隨附 DLL

VC++ 支援的三種 DLL 類型

  • 非 MFC 動態庫
  • MFC 規則 DLL
  • MFC 擴展 DLL

導出函數/變數/類供外部呼叫;內部函數僅限 DLL 內部使用。

導出函數宣告兩種方式

1. __declspec(dllexport)

__declspec(dllexport) int __stdcall Add_new(int a, int b);

2. 模組定義檔 (.def)

LIBRARY MyDll
EXPORTS
    Add_new

DLL 呼叫兩種模式

靜態載入(隱式連結)

  • 編譯器自動載入/卸載
  • 需 .lib 匯入庫與 .h 宣告
  • #pragma comment(lib, "MyDll.lib")

動態載入(顯式連結)

  • 程式設計師手動呼叫 API
  • 流程:LoadLibrary → GetProcAddress → 呼叫函數指標 → FreeLibrary
  • 無需 .lib,執行期靈活決定載入哪個 DLL

完整實作範例

專案設定:必須選 Release 組態

Build → Set Active Configuration → 選擇 Win32 Release

範例一:MFC 規則 DLL - 導出函數

  1. New → Projects → MFC AppWizard (dll) → Regular DLL using shared MFC DLL,專案名 MFC_dll
  2. .def 加入 Add_new
  3. .h 宣告:extern "C" __declspec(dllexport) int __stdcall Add_new(int a, int b);
  4. .cpp 實作:回傳 a + b
  5. 建置 Release,輸出 MFC_dll.dll、MFC_dll.lib、.h 檔

範例二:呼叫 DLL - 靜態載入

// test.h
#pragma comment(lib, "MFC_dll.lib")
extern "C" __declspec(dllimport) int __stdcall Add_new(int a, int b);

// main.cpp
#include "test.h"
#include 
int main() {
    std::cout << Add_new(2, 3);
    return 0;
}

範例三:呼叫 DLL - 動態載入

#include 
#include 
typedef int (*lpAddFun)(int, int);

int main() {
    HINSTANCE hDll = LoadLibrary("dllTest.dll");
    if (hDll) {
        lpAddFun addFun = (lpAddFun)GetProcAddress(hDll, "Add_new");
        if (addFun) {
            int result = addFun(2, 3);
            printf("%d", result);
        }
        FreeLibrary(hDll);
    }
    return 0;
}

範例四:非 MFC DLL - 導出全域變數

// sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif

// sample.cpp
#include "sample.h"
#include 
int dllGlobalVar;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    return TRUE; // 預設入口點
}

關鍵提醒

  • extern "C" 防止 C++ 名稱修飾,確保 GetProcAddress 能找到函數
  • 呼叫慣例 __stdcall 需雙方一致
  • DLL 內部函數不導出,外部不可見
  • Release 版才適合發布

掌握這些基礎,即可在 VC++ 6.0 中靈活建立、部署與呼叫 DLL 元件。

copyright © 萬盛學電腦網 all rights reserved