Как я могу маршал между Xloper и Variant? [закрыто
-
12-10-2019 - |
Вопрос
Я работаю над плагином 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/
и, возможно, другие, о которых я не знаю