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”代码里调用。

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