DllEntryPoint (進入點)、專案選項預設為動態 RTL、執行套件。**必須調整** (見第六節)。// Dll.h
#ifdef BUILDING_MYDLL
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
MYDLL_API int __stdcall Add(int a, int b);
MYDLL_API void __stdcall GetVersion(char* buf, int bufSize);
// Dll.cpp
#include "Dll.h"
int __stdcall Add(int a, int b) { return a + b; }
void __stdcall GetVersion(char* buf, int bufSize) {
const char* ver = "1.0.0";
strncpy(buf, ver, bufSize-1);
buf[bufSize-1] = '\0';
}
// DllClass.h
#ifdef BUILDING_MYDLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class DLLEXPORT __stdcall MyClass {
public:
MyClass();
~MyClass();
int Compute(int x);
private:
int m_value;
};
// DllClass.cpp
#include "DllClass.h"
MyClass::MyClass() : m_value(42) {}
MyClass::~MyClass() {}
int MyClass::Compute(int x) { return m_value * x; }
implib.exe MyDll.lib MyDll.dll (BCB 安裝目錄 Bin 下)。MyDll.lib。#include "Dll.h" / #include "DllClass.h"。// 使用導出函數
int result = Add(3, 5);
// 使用導出類
MyClass* obj = new MyClass();
int val = obj->Compute(10);
delete obj; // 必須在 DLL 內部刪除,或共用記憶體管理器
typedef int (__stdcall *PFN_ADD)(int, int);
typedef void (__stdcall *PFN_GETVER)(char*, int);
HINSTANCE hDll = LoadLibrary("MyDll.dll");
if (hDll) {
PFN_ADD pAdd = (PFN_ADD)GetProcAddress(hDll, "Add");
PFN_GETVER pGetVer = (PFN_GETVER)GetProcAddress(hDll, "GetVersion");
if (pAdd) { int r = pAdd(10, 20); }
if (pGetVer) { char buf[64]; pGetVer(buf, sizeof(buf)); }
FreeLibrary(hDll);
}
// 導出類動態載入極複雜 (需手動取得建構函數、虛函數表),
// 強烈建議改用「導出工廠函數回傳介面指標」模式 (COM 風格)。
| 選項頁 | 設定 | 說明 |
|---|---|---|
| Packages | 取消勾選 Build with runtime packages | 否則 DLL 依賴 vclxx.bpl, rtlxx.bpl 等巨大套件 |
| Linker | 取消勾選 Use dynamic RTL | 否則 DLL 依賴 borlndmm.dll (記憶體管理器) |
| Linker | Map file = Detailed | 除錯時查看導出符號、段分佈 |
效果:產生獨立、無外部 VCL/RTL 依賴的 DLL,僅需系統 DLL (kernel32, user32 等)。體積較大但部署極簡單 (單檔)。
new 的記憶體,**必須由 DLL 內部 delete**。EXE 不得 delete DLL 配置的指標,反之亦然。CreateObject/DestroyObject 導出函數。borlndmm.dll (共用記憶體管理器),但引入部署複雜度。IUnknown + AddRef/Release) 讓物件自我管理生命週期。__stdcall** (Windows API 標準)。__cdecl,若混用會導致堆疊不平衡 Crash。__stdcall:class __declspec(dllexport) __stdcall MyClass。tdump -ee MyDll.dll # BCB 工具
dumpbin /exports MyDll.dll # Visual Studio 工具