Импорт данных с помощью __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)
, компилятор автоматически создает код косвенного обращения. Вам не нужно беспокоиться об описанных выше действиях. Как уже отмечалось ранее, не используйте объявление __declspec(dllimport)
для данных при сборке библиотеки DLL. Функции в библиотеке 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