EXPORTS
引入了一个由一个或多个 definitions(导出的函数或数据)组成的节。 每个定义必须在单独一行上。
EXPORTS
definitions
备注
EXPORTS 关键字可以在第一个定义所在的同一行或前一行上。 .def 文件可以包含一个或多个 EXPORTS 语句。
导出 definitions 的语法为:
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
entryname 是要导出的函数名或变量名。 这是必选项。 如果导出的名称与 DLL 中的名称不同,则通过 internalname 指定 DLL 中导出的名称。 例如,如果 DLL 导出函数 func1(),要将它用作 func2(),则应指定:
EXPORTS
func2=func1
@ordinal 允许指定是序号而不是函数名将进入 DLL 的导出表。 这有助于最小化 DLL 的大小。 .LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用 DLL 的项目中那样使用函数名。
可选 NONAME 关键字允许只按序号导出,并减小结果 DLL 中导出表的大小。 但是,如果要在 DLL 上使用 GetProcAddress,则必须知道序号,因为名称将无效。
可选 PRIVATE 关键字禁止将 entryname 放到由 LINK 生成的导入库中。 它对同样是由 LINK 生成的图像中的导出无效。
可选 DATA 关键字指定导出的是数据,而不是代码。 例如,可以导出数据变量,如下所示:
EXPORTS
i DATA
当对同一导出使用 PRIVATE 和 DATA 时,PRIVATE 必须位于 DATA 的前面。
有三种导出定义的方法,按照建议的使用顺序依次为:
源代码中的 __declspec(dllexport) 关键字
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
所有这三种方法可以用在同一个程序中。 LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。
以下是 EXPORTS 节的示例:
EXPORTS
DllCanUnloadNow @1 PRIVATE DATA
DllWindowName = Name DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
注意,使用 .def 文件从 DLL 中导出变量时,不需要在变量上指定 __declspec(dllexport)。 但是,在任何使用 DLL 的文件中,仍必须在数据声明上使用 __declspec(dllimport)。