本文詳細說明 VC++ 6.0 環境下靜態/動態連結庫的差異、DLL 類型、導出方式、呼叫模式與完整實作範例。
| 特性 | 靜態庫 (.lib) | 動態庫 (.dll) |
|---|---|---|
| 程式碼包含方式 | 直接鏈接進 EXE | 執行時動態載入/卸載 |
| 可包含其他庫 | 不可 | 可包含靜態/動態庫 |
| 部署 | 單一 EXE | 需隨附 DLL |
導出函數/變數/類供外部呼叫;內部函數僅限 DLL 內部使用。
__declspec(dllexport) int __stdcall Add_new(int a, int b);
LIBRARY MyDll
EXPORTS
Add_new
.lib 匯入庫與 .h 宣告#pragma comment(lib, "MyDll.lib")LoadLibrary → GetProcAddress → 呼叫函數指標 → FreeLibraryBuild → Set Active Configuration → 選擇 Win32 Release
MFC_dllAdd_newextern "C" __declspec(dllexport) int __stdcall Add_new(int a, int b);a + bMFC_dll.dll、MFC_dll.lib、.h 檔// 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;
}
#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;
}
// 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 需雙方一致掌握這些基礎,即可在 VC++ 6.0 中靈活建立、部署與呼叫 DLL 元件。