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


Экспорт из библиотеки 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 по порядку, а не по имени.

a90k134d.alert_note(ru-ru,VS.90).gifПримечание.

При переносе исходного кода библиотеки DLL с Win16 на Win32 необходимо заменить каждый экземпляр __export ключевым словом __declspec(dllexport).

Для получения справки можно в файле заголовка Winbase.h выполнить поиск по слову "Win32". Там же можно найти примеры использования __declspec(dllimport).

Дополнительные сведения:

Выполняемые задачи

См. также

Основные понятия

Экспорт из библиотеки DLL