Вопрос

Я работаю над плагином Excel (XLL), который общается с объектами COM. Итак, я должен маршал между Xloper и Variant. У меня большая часть этой работы, но массивы определенно боль. Мне нужно поддерживать 1- и 2D массивы.

Я полагаю, что кому -то уже приходилось иметь дело с этим раньше. Как лучше всего упростить работу с вариантами, Safearray и Xloper (и Xloper12)?

Это было полезно?

Решение

Мне пришлось вручную бросить свой собственный код маршалирования для этого. Там не было свободно доступных либеров, чтобы справиться с этим. XLW предназначен для обертывания всего вашего плагина - это не было для меня вариантом.

В конце концов, это заняло много времени, просмотрев документацию для Xloper и Variant, и выяснить, как их сопоставить друг с другом.

Для любопытного:

массивы в Xloper (12):

  • .xltype - это xltypemulti
  • .val.array - это указатель на массив Xlopers.

массивы в варианте:

  • .vt is vt_array | Vt_variant
  • . Парень - это безопасность вариантов

Другие советы с этим маршаллом:

  • xltyperef и xltypesref: используйте Xlcoerce, чтобы найти фактические значения ячейки.
  • Целостные значения ставят риск переполнения. boost::numeric_cast Помогает с этим.
  • String Marshalling раздражает. Xloper использует Char, Xloper12 использует WCHAR, вариант использует BSTR.
  • Не забудьте освободить буферы, которые вы выделяете для ваших новых xloper Strings. Соответственно используйте Xlbitdllfree и xlautofree (12).
  • Программирование шаблона полезно для проблемы Xloper/Xloper12. Boost помогает. _BSTR_T также помогает.

Другие советы

Я использую XLL Plus (затраты)http://www.as-ltd.co.uk/xllplus/default.htm

Есть также XLW (OpenSource)http://xlw.sourceforge.net/

и, возможно, другие, о которых я не знаю

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top