Обратная совместимость

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

В этом разделе рассматриваются проблемы совместимости XLL в разных версиях Microsoft Excel.

Полезные определения констант

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

#define MAX_XL11_ROWS            65536
#define MAX_XL11_COLS              256
#define MAX_XL12_ROWS          1048576
#define MAX_XL12_COLS            16384
#define MAX_XL11_UDF_ARGS           30
#define MAX_XL12_UDF_ARGS          255
#define MAX_XL4_STR_LEN           255u
#define MAX_XL12_STR_LEN        32767u

Получение работающей версии

Вы должны определить, какая версия выполняется с помощью Excel4(xlfGetWorkspace, &version, 1, &arg), где arg — числовое значение XLOPER , для которого задано значение 2, а version — это строка XLOPER , которую затем можно принулить к целочисленным. Для Microsoft Excel 2013 это 15,0. Это следует сделать в функции xlAutoOpen или из нее . Затем можно задать глобальную переменную, которая сообщает всем модулям в проекте, какая версия Excel запущена. Затем ваш код может решить, следует ли вызывать API C с помощью Excel12 и XLOPER12, или с помощью Excel4 с помощью XLOPERs.

Вы можете вызвать XLCallVer , чтобы обнаружить версию API C, но это не указывает, какая из версий, предшествующих Excel 2007, используется.

Создание надстроек для экспорта двойных интерфейсов

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

LPXLOPER WINAPI my_xll_fn(unsigned char *arg);

Хотя это работает отлично, есть несколько причин, по которым этот интерфейс не является идеальным для вашего кода, начиная с Excel 2007:

  • Он зависит от ограничений строк байтов API C и не может получить доступ к длинным строкам Юникода, поддерживаемым начиная с Excel 2007.
  • Хотя, начиная с Excel 2007, Excel может передавать и принимать XLOPERs, внутренне он преобразует их в XLOPER12, поэтому в Excel 2007 возникают неявные издержки преобразования, которые отсутствуют при выполнении кода в более ранних версиях Excel.
  • Возможно, эту функцию можно сделать потокобезопасной, но если строка типа изменена на PD$, регистрация завершается сбоем, начиная с Excel 2007.

По этим причинам, в идеале, начиная с Excel 2007, следует экспортировать функцию для пользователей, которая была зарегистрирована как QD%$, при условии, что ваш код является потокобезопасный и прототипирован следующим образом.

LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);

Еще одна причина, по которой может потребоваться зарегистрировать другую функцию, начиная с Excel 2007, заключается в том, что она позволяет функциям XLL принимать до 255 аргументов, а не 30 более ранних версий.

К счастью, вы можете воспользоваться преимуществами обеих версий, экспортируя обе версии из проекта. Затем можно определить запущенную версию Excel и условно зарегистрировать наиболее подходящую функцию. Дополнительные сведения и пример реализации см. в статье Разработка надстроек (XLLs) в Excel 2007.

Такой подход приводит к тому, что на листе, работающем в Excel 2003, могут отображаться результаты, отличные от результатов на том же листе, запущенном в Excel 2007. Например, Excel 2003 сопоставляет строку Юникода в ячейке листа Excel 2003 с байтовой строкой ASCII и усекнет ее перед передачей в функцию XLL. Начиная с Excel 2007, Excel передает несконвертированную строку Юникода в функцию XLL, зарегистрированную правильным образом. Это может привести к другому результату. Вы должны знать об этой возможности и последствиях для пользователей, а не только при обновлении. Например, некоторые встроенные числовые функции были улучшены между Excel 2000 и Excel 2003.

Новые функции листа и функции средства анализа

Функции средства анализа (ATP) являются частью Excel, начиная с Excel 2007. Ранее XLL мог вызывать функцию ATP только с помощью xlUDF. Начиная с Excel 2007 функции ATP должны вызываться с помощью перечислений функций, определенных в xlcall.h. В примере в разделе Вызов определяемых пользователем функций из библиотек DLL показаны два разных метода.

См. также