建立 Win32 DLL 專案,定義類別 CInDLL 需供外部專案使用。導出類別需在生成的 DLL 匯入庫保留足夠符號資訊,兩種主流方案:
// 導出時
class __declspec(dllexport) CInDLL { ... };
// 使用時 (客戶端專案)
class __declspec(dllimport) CInDLL { ... };
缺點:標頭檔需視建置端切換巨集,維護麻煩。
標頭檔定義巨集,實作檔定義導出標記:
// CInDLL.h
#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif
class CLASSINDLL_CLASS_DECL CInDLL {
public:
CInDLL();
// ...
};
// CInDLL.cpp
#define _CLASSINDLL // 定義導出標記
#include "CInDLL.h"
CInDLL::CInDLL() { }
// ...
_CLASSINDLL 已定義 → CLASSINDLL_CLASS_DECL 展開為 __declspec(dllexport),類別匯出_CLASSINDLL → 展開為 __declspec(dllimport),類別匯入亦可使用 .def 檔案列出導出符號,避免標頭檔污染,但維護較繁瑣。現代 VC 專案推薦巨集方案。