Импорт данных с помощью объявления __declspec(dllimport)
Использование объявления __declspec(dllimport) при работе с данными позволяет устранить уровень косвенного обращения. При импорте данных из библиотеки DLL по-прежнему сохраняется необходимость просмотра таблицы адресов импорта. Если объявление __declspec(dllimport) не используется, при обращении к данным, экспортированным из библиотеки DLL, необходимо использовать дополнительный уровень косвенного обращения:
// project.h
#ifdef _DLL // 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 используйте следующее объявление:
__declspec(dllexport) ULONG ulDataInDLL;