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


Экспорт из библиотеки DLL с использованием __declspec(dllexport)

С помощью ключевого слова __declspec(dllexport) вы можете экспортировать данные, функции, классы или функции-члены класса из библиотеки DLL. При использовании ключевого слова __declspec(dllexport) в объектный файл добавляется директива экспорта, поэтому необходимости в DEF-файле нет.

Это особенно удобно при экспорте дополненных имен функций C++. Поскольку стандартные соглашения о дополнении имен отсутствуют, имена экспортированных функций могут различаться в разных версиях компилятора. Если вы используете __declspec(dllexport), перекомпиляция библиотеки DLL и зависимых EXE-файлов требуется только для того, чтобы учесть изменения в соглашениях об именовании.

Многие директивы экспорта, в том числе на основе порядковых номеров, а также NONAME и PRIVATE, могут определяться только в DEF-файле. Способов определить эти атрибуты без DEF-файла не существует. Тем не менее, если использовать __declspec(dllexport) вместе с DEF-файлом, ошибки сборки возникать не будут.

Для экспорта функций ключевое слово __declspec(dllexport) должно использоваться слева от ключевого слова соглашения о вызовах, если оно задано. Например:

__declspec(dllexport) void __cdecl Function1(void);

Чтобы экспортировать все открытые члены данных и функции-члены в классе, это ключевое слово должно использоваться слева от имени класса следующим образом:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

Примечание.

__declspec(dllexport) нельзя применять к функции с соглашением о вызовах __clrcall.

При построении библиотеки DLL, как правило, создается файл заголовка, который содержит прототипы функций и (или) экспортируемые классы, а также добавляется ключевое слово __declspec(dllexport) в раздел объявлений файла заголовка. Чтобы сделать код более удобочитаемым, определите макрос для __declspec(dllexport), а затем используйте этот макрос для каждого экспортируемого символа:

#define DllExport   __declspec( dllexport )

__declspec(dllexport) сохраняет имена функций в таблице экспорта библиотеки DLL. Сведения об оптимизации размера этой таблицы см. в разделе Экспорт функций из библиотеки DLL по порядковому номеру, а не по имени.

Что вы хотите сделать?

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

См. также

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