Создание XLL-файлов

Область применения: Excel 2013 | Office 2013 | Visual Studio

Если ваша библиотека DLL автономная или зависит от других библиотек, необходимо знать, как обеспечить для Microsoft Excel доступ к ее функциям и командам. Дополнительные сведения см. в статье Доступ к библиотекам DLL в Excel.

Но если вашей библиотеке DLL требуется доступ к функциям Excel (например, для получения содержимого ячейки, вызова функции листа или запрашивания у Excel сведений о рабочей области), в коде необходимо предусмотреть возможность обратного вызова Excel.

В API C Excel доступны несколько функций, которые обеспечивают для библиотек DLL возможность обратного вызова Excel. Для доступа к этим функциям библиотеку DLL во время компиляции необходимо статически связать с xlcall32.lib, 32-разрядной библиотекой Excel. Статическую библиотеку можно скачать на сайте Майкрософт в составе пакета SDK XLL для Microsoft Excel 2013, в который входят 32- и 64-разрядная версии этой библиотеки.

Обеспечение обратного вызова Excel для библиотек DLL

Чтобы библиотека DLL могла получить доступ к функциям Excel и получить или задать сведения о рабочей области, она сначала должна получить адреса функций обратного вызова Excel (Excel4, Excel4v, Excel12 и Excel12v). Последние две функции, которые появились в Excel 2007, доступны в последующих версиях. Чтобы получить доступ ко всем этим функциям, проект DLL должен включать ссылки на перечисленные ниже файлы, представленные в пакете SDK XLL для Excel 2013. Если вы хотите получить доступ только к первым двум функциям обратного вызова (в любой версии Excel), проект должен включать только первые два файла.

Xlcall.h

Файл Xlcall.h содержит следующие элементы:

  • прототипы функций для всех функций обратного вызова;

  • определения структур данных, которые используются в функциях обратного вызова для обмена данными между DLL или XLL и Excel, а также определения констант типов данных;

  • определения функции API C и эквивалентные команды для листа, функций листа макросов и поддерживаемых команд Excel;

  • определения возвращаемых значений функций обратного вызова.

Следует использовать директиву #include для этого файла (непосредственно или косвенно с помощью другого файла заголовка) во всех файлах, которые получают доступ к API C или обрабатывают типы данных, используемые в этом API.

Xlcall32.lib

Библиотека Xlcall32.lib экспортирует первые две функции обратного вызова (Excel4 и Excel4v), а также функцию XlCallVer. Если в вашем проекте нет ссылки на эту библиотеку, компоновщик не сможет создать XLL-файл, если вы использовали любые из этих функций обратного вызова в своем коде. (Адреса этих функций можно получить путем динамического связывания с эквивалентным файлом Xlcall32.dll, который копируется в систему во время обычной установки Excel.)

Xlcall.cpp

Функции обратного вызова Excel Excel12 и Excel12v не экспортируются в Xlcall32.lib. Благодаря этому проекты XLL, созданные в Excel 2007, также будут работать с более ранними версиями Excel. Модуль Xlcall.cpp содержит код для функций Excel12 и Excel12v, которые обеспечивают вызов точки входа в Excel, начиная с Excel 2007, или возвращают безопасное значение ошибки, если запущена более ранняя версия Excel. Этот модуль следует включить в проект, если вы хотите создать библиотеку XLL, которая запускается в Excel 2007 и в которой можно использовать новые типы данных, которые поддерживают обработку сеток большего размера и более длинных строк в Юникоде.

Примечание.

Начиная с пакета SDK для Excel 2010, этот файл можно компилировать для 32- и 64-разрядных библиотек XLL.

Преобразование библиотек DLL в XLL: функции интерфейса диспетчера надстроек

XLL представляет собой библиотеку DLL, которая экспортирует несколько процедур, которые вызывает Excel или диспетчер надстроек Excel. Эти процедуры вкратце описываются в этой статье и подробно рассматриваются в статье Функции диспетчера надстроек и интерфейса XLL. Все эти функции обратного вызова DLL начинаются с префикса xlAuto. Обязательной является только одна из них, а именно команда xlAutoOpen. Она вызывается при активации надстройки и обычно используется для регистрации функций и команд XLL в Excel, а также для выполнения других задач инициализации. Сигнатуры функций и примеры реализации всех функций xlAuto приведены далее в этой статье.

Хотя среди всех этих функций обратного вызова обязательной является только функция xlAutoOpen, вашей надстройке также может понадобиться экспортировать другие функции в зависимости от ее поведения.

В Excel 2007 представлен новый тип данных XLOPER12, который обеспечивает поддержку сеток большего размера и длинных строк в Юникоде. Тип данных XLOPER12 описан далее в этой статье. В то время как функции xlAuto извлекают или возвращают старый тип данных XLOPER, в Excel 2007 представлены новые версии этих функций, в которых используются типы данных XLOPER12. За исключением функции xlAutoFree12, которую иногда необходимо внедрить во избежание утечек памяти XLOPER12, вы можете безопасно пропустить установку всех функций xlAuto версии 12. В этом случае Excel 2007 и более поздних версий будет вызывать версии XLOPER.

xlAutoOpen

Excel вызывает функцию xlAutoOpen при активации библиотеки XLL. Надстройка будет активирована при запуске сеанса Excel, если она была активна во время последнего сеанса Excel, который нормально завершил работу. Надстройка активируется при загрузке во время сеанса Excel. Надстройку можно выключить и повторно активировать во время сеанса Excel. Вызов функции выполняется после повторной активации.

Функцию xlAutoOpen следует использовать для регистрации функций и команд XLL, инициализации структур данных, настройки пользовательского интерфейса и других задач.

Если ваша надстройка реализует и экспортирует функцию xlAutoRegister или xlAutoRegister12, Excel может попытаться активировать и зарегистрировать функцию или команду, не вызывая функцию xlAutoOpen. В этом случае следует убедиться, что ваша надстройка инициализирована в достаточной мере для правильной работы функции или команды. В противном случае вам может не удаться зарегистрировать функцию или команду либо выполнить необходимые действия по инициализации.

xlAutoClose

Excel вызывает функцию xlAutoClose при выключении библиотеки XLL. Надстройка будет отключена после нормального завершения сеанса Excel. Если пользователь отключает надстройку во время сеанса Excel, выполняется вызов функции.

Функцию xlAutoClose следует использовать для отмены регистрации функций и команд, освобождения ресурсов, отмены настроек и других задач.

Примечание.

При отмене регистрации функций и команд возникает известная проблема. Дополнительные сведения см. в статье Известные проблемы, возникающие при разработке XLL для Excel.

xlAutoAdd

Excel вызывает функцию xlAutoAdd, когда пользователь с помощью диспетчера надстроек активирует библиотеку XLL во время сеанса Excel. Вызов этой функции не выполняется, когда Excel при запуске загружает предустановленную надстройку.

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

xlAutoRemove

Excel вызывает функцию xlAutoRemove, когда пользователь с помощью диспетчера надстроек отключает библиотеку XLL во время сеанса Excel. Вызов этой функции не выполняется, если сеанс Excel закрывается (правильно или ненормально) при установленной надстройке.

С помощью этой функции можно отобразить настраиваемое диалоговое окно с уведомлением об отключении надстройки, а также считать данные из реестра или записать их в реестр.

xlAddInManagerInfo и xlAddInManagerInfo12

Excel вызывает функцию xlAddInManagerInfo при первом вызове диспетчера надстроек во время сеанса Excel. Если в Excel передается аргумент, равный 1, эта функция должна возвратить строку (как правило, имя надстройки). В противном случае она возвращает значение #VALUE!.

Начиная с Excel 2007, Excel в первую очередь вызывает функцию xlAddInManagerInfo12, а не xlAddInManagerInfo, если она экспортирована с помощью библиотеки XLL. Функция xlAddInManagerInfo12 должна работать так же, как функция xlAddInManagerInfo, во избежание характерных для версий различий в поведении библиотеки XLL. Функция xlAddInManagerInfo12 должна возвращать тип данных XLOPER12, а функция xlAddInManagerInfo — тип данных XLOPER.

xlAutoRegister и xlAutoRegister12

Excel вызывает функцию xlAutoRegister при вызове функции XLM REGISTER или аналогичной функции xlfRegister, предусмотренной в API C, если для регистрируемой функции отсутствуют типы возвращаемого значения и аргумента. С помощью функции xlAutoRegister библиотека XLL может выполнить поиск в своих внутренних списках экспортированных функций и команд, чтобы зарегистрировать функцию с аргументом и вернуть указанные типы.

Начиная с Excel 2007, Excel в первую очередь вызывает функцию xlAddInRegister12, а не xlAddInRegister, если она экспортирована с помощью библиотеки XLL.

Примечание.

Если функция xlAddInRegister/ xlAddInRegister12 пытается зарегистрировать функцию, не предоставив типы аргумента и возвращаемого значения, наблюдается рекурсивный цикл вызовов, вследствие чего стек вызовов постепенно переполняется, а Excel закрывается или перестает отвечать на запросы.

xlAutoFree и xlAutoFree12

Excel вызывает функцию xlAutoFree или xlAutoFree12 только после того, как функция листа XLL возвращает тип данных XLOPER/ XLOPER12 с установленным флагом о наличии памяти, которую все еще необходимо освободить с помощью библиотеки XLL. Благодаря этому библиотека XLL может вернуть динамически выделяемые массивы, строки и внешние ссылки на лист без утечек памяти. Тип данных XLOPER12 поддерживается, начиная с Excel 2007. Дополнительные сведения см. в статье Управление памятью в Excel.

Примечание.

Начиная с Excel 2007, при настройке Excel на многопоточный пересчет листа функция xlAutoFree/ xlAutoFree12 вызывается для потока, который только что использовался для вызова функции, возвратившей его. Вызов функции xlAutoFree/ xlAutoFree12 всегда выполняется перед оценкой последующих ячеек листа для этого потока. Это упрощает потокобезопасную разработку библиотеки XLL. Дополнительные сведения см. в статье Многопотоковый пересчет в Excel.

Создание 64-разрядных библиотек XLL

Excel и определяемые пользователем функции можно выполнять в 64-разрядных операционных системах, ведь они более производительны, если сравнивать их с 32-разрядными операционными системами. Excel передает значения в структуры XLOPER12, которые включают сведения о типах данных. При преобразовании значений в структуре XLOPER12 и собственных типах, таких как int или указатели, должны сохраниться значения в большем типе.

См. также

Вызов функций XLL из диалоговых окон "Мастер функций" и "Замена"

Функции диспетчера надстроек и интерфейса XLL

Разработка XLL-файлов для Excel