如何在VC中導出類,這是一個常有人問起的問題,下面我以一個簡單的例子來說明這個問題:
首先使用Wizard創建一個Win32 Dynamic-Link Library工程,然後定義一個簡單的C++類CInDLL。由於該類會被工程之外的文件所引用,所以需要對這個類進行引出。因為只有引出後所生成的DLL中才帶有供足夠的信息以在連接和運行時被正確引入到進程空間中。有兩種方法可以引出類,使用__declspec(dllexport)定義和使用定義文件。
下面先講使用__declspec(dllexport)的方法:將類定義改為:class __declspec(dllexport) CInDLL 就可以了。(譯者:你也許不相信會有這麼簡單,我也不相信。:-) 這樣產生的工程在編譯時是正確的但是在使用時會產生錯誤,因為你包含的頭文件中也是使用__declspec(dllexport),而使用這個DLL的工程中並沒有引出這個類,而是需要引入這個類)在使用時需要將類定義改為class __declspec(dllimport) CInDLL就可以了。
使用定義文件可以有效的避免這個問題,這種方法是利用宏定義在不同的地方產生不同的編譯代碼:在頭文件中加入如下的代碼:
#ifdef _CLASSINDLL #define CLASSINDLL_CLASS_DECL
__declspec(dllexport) #else #define CLASSINDLL_CLASS_DECL
__declspec(dllimport) #endif #endif // ClassInDLL_H //將class __declspec(dllexport)
CInDLL改為 class CLASSINDLL_CLASS_DECL CInDLL { CInDLL(); ... }
在實現這個類的CPP文件的頂部加入#define _CLASSINDLL語句。
#define _CLASSINDLL CInDLL::CInDLL() { } ...
這樣一來在使用這個類時就可以不做任何改動了.