Экспорт из библиотеки DLL с использованием __declspec(dllexport)
Обновлен: Ноябрь 2007
В 16-разрядной версии компилятора Visual C++ Майкрософт ввел понятие __export, которое позволяет компилятору автоматически создавать экспортируемые имена функций и помещать их в LIB-файл. Затем LIB-файл используется для связи с библиотекой DLL, однако следует отметить, что LIB-файл является статическим.
В новых версиях компилятора экспорт данных, функций, классов или классов функций-членов из библиотеки DLL можно осуществлять с помощью ключевого слова __declspec(dllexport). Ключевое слово __declspec(dllexport) добавляет директивы экспорта в объектный файл, следовательно, отпадает необходимость использовать DEF-файл.
Данное преимущество особенно заметно при экспорте декорированных имен функций C++. Так как стандарта спецификации по декорированию имен функции не существует, то имя экспортируемой функции может отличаться в зависимости от версии компилятора. Если используется ключевое слово __declspec(dllexport), перекомпиляция библиотеки DLL и EXE-файлов необходима только для регистрации изменений в соглашениях об именах.
Большинство директив экспорта, например, NONAME и PRIVATE, можно указать только в DEF-файле, других способов указания данных атрибутов без использования DEF-файла не существует. Однако если наряду с DEF-файлом используется __declspec(dllexport), ошибок при построении не будет.
Чтобы экспортировать функции, ключевое слово __declspec(dllexport) должно стоять слева от ключевого слова соглашения о вызовах, если оно задано. Пример.
__declspec(dllexport) void __cdecl Function1(void);
Чтобы экспортировать все общие члены данных и функции-члены в класс, ключевое слово должно стоять слева от имени класса:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
При построении библиотеки DLL, как правило, создается файл заголовка, который содержит прототипы функций и (или) экспортируемые классы, а также объявления с ключевым словом __declspec(dllexport). Чтобы сделать код более удобочитаемым, можно для __declspec(dllimport) определить макрос и использовать его для объявления каждого импортируемого символа:
#define DllExport __declspec( dllexport )
__declspec(dllexport) сохраняет имена функций в таблице экспорта библиотеки DLL. Сведения по оптимизации таблицы размеров можно посмотреть в разделе Экспорт функций из библиотеки DLL по порядку, а не по имени.
Примечание. |
---|
При переносе исходного кода библиотеки DLL с Win16 на Win32 необходимо заменить каждый экземпляр __export ключевым словом __declspec(dllexport). |
Для получения справки можно в файле заголовка Winbase.h выполнить поиск по слову "Win32". Там же можно найти примеры использования __declspec(dllimport).
Дополнительные сведения:
Экспорт функций C++ для использования в исполняемых файлах, исходный код которых написан на языке C
Импорт в приложение с использованием ключевого слова __declspec(dllimport)