C++導出函數 或數據

  1. 輸出函數的方法

     

  1. 傳統的方法

    在模塊定義文件的EXPORT部分指定要輸入的函數或者變量。語法格式如下:

    entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]

    其中:

    entryname是輸出的函數或者數據被引用的名稱;

    internalname同entryname;

    @ordinal表示在輸出表中的順序號(index);

    NONAME僅僅在按順序號輸出時被使用(不使用entryname);

    DATA表示輸出的是數據項,使用DLL輸出數據的程序必須聲明該數據項爲_declspec(dllimport)。

    上述各項中,只有entryname項是必須的,其他可以省略。

    對於“C”函數來說,entryname可以等同於函數名;但是對“C++”函數(成員函數、非成員函數)來說,entryname是修飾名。可以從.map映像文件中得到要輸出函數的修飾名,或者使用DUMPBIN /SYMBOLS得到,然後把它們寫在.def文件的輸出模塊。DUMPBIN是VC提供的一個工具。

    如果要輸出一個“C++”類,則把要輸出的數據和成員的修飾名都寫入.def模塊定義文件。

  2. 在命令行輸出

    對鏈接程序LINK指定/EXPORT命令行參數,輸出有關函數。

  3. 使用MFC提供的修飾符號_declspec(dllexport)

在要輸出的函數、類、數據的聲明前加上_declspec(dllexport)的修飾符,表示輸出。MFC提供了一些宏,就有這樣的作用,如表7-2所示。

表7-2 MFC定義的輸入輸出修飾符

宏名稱

宏內容

AFX_CLASS_IMPORT

__declspec(dllexport)

AFX_API_IMPORT

__declspec(dllexport)

AFX_DATA_IMPORT

__declspec(dllexport)

AFX_CLASS_EXPORT

__declspec(dllexport)

AFX_API_EXPORT

__declspec(dllexport)

AFX_DATA_EXPORT

__declspec(dllexport)

AFX_EXT_CLASS

#ifdef _AFXEXT

AFX_CLASS_EXPORT

#else

AFX_CLASS_IMPORT

AFX_EXT_API

#ifdef _AFXEXT

AFX_API_EXPORT

#else

AFX_API_IMPORT

AFX_EXT_DATA

#ifdef _AFXEXT

AFX_DATA_EXPORT

#else

AFX_DATA_IMPORT

AFX_EXT_DATADEF

 

像AFX_EXT_CLASS這樣的宏,如果用於DLL應用程序的實現中,則表示輸出(因爲_AFX_EXT被定義,通常是在編譯器的標識參數中指定該選項/D_AFX_EXT);如果用於使用DLL的應用程序中,則表示輸入(_AFX_EXT沒有定義)。

要輸出整個的類,對類使用_declspec(_dllexpot);要輸出類的成員函數,則對該函數使用_declspec(_dllexport)。如:

class AFX_EXT_CLASS CTextDoc : public CDocument

{

}

extern "C" AFX_EXT_API void WINAPI InitMYDLL();

這幾種方法中,最好採用第三種,方便好用;其次是第一種,如果按順序號輸出,調用效率會高些;最次是第二種。

在“C++”下定義“C”函數,需要加extern “C”關鍵詞。輸出的“C”函數可以從“C”代碼裏調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章