使用 __declspec(dllimport)
导入数据
对于数据,使用 __declspec(dllimport)
是删除间接寻址层的便捷项。 从 DLL 导入数据时,仍必须浏览导入地址表。 也就是说,在使用 __declspec(dllimport)
之前,访问从 DLL 导出的数据时,请务必执行额外级别的间接寻址:
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
ULONG ulDataInDll;
#else // If accessing the data from outside the DLL
ULONG *ulDataInDll;
#endif
然后导出 .DEF 文件中的数据:
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
并从 DLL 外部访问它:
if (*ulDataInDll == 0L)
{
// Do stuff here
}
如果你将数据标记为 __declspec(dllimport)
,编译器会自动为你生成间接寻址代码。 你不必再担心以上步骤。 如前所述,在生成 DLL 时,不要对数据使用 __declspec(dllimport)
声明。 DLL 中的函数不会使用导入地址表来访问数据对象;因此,不会有额外级别的间接寻出现。
若要从 DLL 中自动导出数据,请使用以下声明:
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
__declspec(dllexport) ULONG ulDataInDLL;
#else // If accessing the data from outside the DLL
__declspec(dllimport) ULONG ulDataInDLL;
#endif