Поделиться через


Импорт данных с помощью __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

См. также

Импорт в приложение