有時(shí)我們需要將在VC中定義的類導(dǎo)出來,以在其它地方使用,本文將使用一個(gè)例子來講解具體的方法。
首先,使用Wizard創(chuàng)建一個(gè)Win32 Dynamic-Link Library工程,然后定義一個(gè)簡(jiǎn)單的C++類CInDLL.由于該類會(huì)被工程之外的文件所引用,所以需要對(duì)這個(gè)類進(jìn)行引出。因?yàn)橹挥幸龊笏傻腄LL中才帶有供足夠的信息以在連接和運(yùn)行時(shí)被正確引入到進(jìn)程空間中。
有兩種方法可以引出類,使用__declspec(dllexport)定義和使用定義文件。
下面先講使用__declspec(dllexport)的方法:
將類定義改為:class __declspec(dllexport) CInDLL 就可以了。 這樣產(chǎn)生的工程在編譯時(shí)是正確的但是在使用時(shí)會(huì)產(chǎn)生錯(cuò)誤,因?yàn)槟惆念^文件中也是使用__declspec(dllexport),而使用這個(gè)DLL的工程中并沒有引出這個(gè)類,而是需要引入這個(gè)類)在使用時(shí)需要將類定義改為class __declspec(dllimport) CInDLL就可以了。
使用定義文件可以有效的避免這個(gè)問題,這種方法是利用宏定義在不同的地方產(chǎn)生不同的編譯代碼:
在頭文件中加入如下的代碼:
#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();……}
在實(shí)現(xiàn)這個(gè)類的CPP文件的頂部加入#define _CLASSINDLL語句。
#define _CLASSINDLLCInDLL::CInDLL(){}……
這樣一來在使用這個(gè)類時(shí)就可以不做任何改動(dòng)了。
新聞熱點(diǎn)
疑難解答