DllEntryPoint (進入點)、預設導出函數/類範例。extern "C" __declspec(dllexport) ReturnType __stdcall FuncName(Params);
extern "C":防止 C++ 名稱修飾,確保 GetProcAddress 能以原名找到。__stdcall:Windows API 標準呼叫慣例,建議統一使用。class __declspec(dllexport) __stdcall MyDllClass {
public:
MyDllClass();
void CreateAForm();
TForm* DllMyForm;
};
// Dll.cpp
#include "DllForm.h" // TDllFrm 定義
USERES("Dll.res");
USEFORM("DllForm.cpp", DllFrm);
class __declspec(dllexport) __stdcall MyDllClass {
public:
MyDllClass() {}
void CreateAForm() {
DllMyForm = new TDllFrm(Application);
DllMyForm->Show();
}
TDllFrm* DllMyForm;
};
TDllFrm* DllMyForm2;
extern "C" __declspec(dllexport) __stdcall void CreateFromFunct() {
DllMyForm2 = new TDllFrm(Application);
DllMyForm2->Show();
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) {
return 1; // 成功
}
implib.exe 產生 import library:implib MyDll.lib MyDll.dllMyDll.lib 加入調用端專案 (Project → Add to Project)。// Unit1.h
#include "DllForm.h"
__declspec(dllimport) class __stdcall MyDllClass {
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();
// Unit1.cpp
MyDllClass* DllClass = nullptr;
void __fastcall TForm1::Button1Click(TObject *Sender) {
DllClass = new MyDllClass(); // 導出類必須靜態調用
DllClass->CreateAForm();
}
void __fastcall TForm1::Button2Click(TObject *Sender) {
CreateFromFunct(); // 導出函數
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) {
delete DllClass;
}
適用於:無 .lib、延遲載入、條件載入、插件架構。
HINSTANCE hDll = LoadLibrary("MyDll.dll");
if (hDll) {
// 導出函數
typedef void (__stdcall *PFN_CREATE)();
PFN_CREATE pCreate = (PFN_CREATE)GetProcAddress(hDll, "CreateFromFunct");
if (pCreate) pCreate();
// 導出類較複雜:需取得建構函數、成員函數位址,手動管理 this 指標
// 建議改用「導出工廠函數回傳介面指標」模式
FreeLibrary(hDll);
}
vclxx.bpl、rtlxx.bpl 等執行套件,部署麻煩。DestroyObject 導出函數,或共用 borlndmm.dll (啟用 dynamic RTL 並部署)。implib 產生的 .lib 僅含導出符號表,無程式碼。tdump -ee MyDll.dll 或 dumpbin /exports 可檢視導出符號。