如何在 XLOPER 和 VARIANT 之间编组? [关闭]
Posted
技术标签:
【中文标题】如何在 XLOPER 和 VARIANT 之间编组? [关闭]【英文标题】:How can I marshall between XLOPER and VARIANT? [closed] 【发布时间】:2010-12-22 23:32:38 【问题描述】:我正在开发一个与 COM 对象通信的 Excel 插件 (XLL)。所以,我必须在 XLOPER 和 VARIANT 之间进行编组。我已经完成了大部分工作,但数组绝对是一种痛苦。我需要支持一维和二维数组。
我想之前已经有人处理过这个问题了。简化处理 VARIANT、SAFEARRAY 和 XLOPER(以及 XLOPER12)的最佳方法是什么?
【问题讨论】:
查看这个新帖子以获得答案:***.com/questions/27473463/… 由于 Malik 上面的链接已经失效,这里有一个 archive.org 版本 web.archive.org/web/20150616142740/https://***.com/… 谢谢@AndyTerra,我不知道为什么我删除了我的帖子......我只是取消了它。 【参考方案1】:为此,我不得不手动编写自己的编组代码。没有免费可用的库来处理这个问题。 XLW 是用来包装你的整个插件的——这不是我的选择。
最后,只是花了很多时间,查看 xloper 和变体的文档,并弄清楚如何将它们相互映射。
对于好奇的人:
xloper(12) 中的数组:
.xltype 是 xltypeMulti .val.array 是一个指向 xlopers 数组的指针。变体中的数组:
.vt 是 VT_ARRAY | VT_VARIANT .parray 是变体的 SafeArray此编组的其他提示:
xltypeRef 和 xltypeSRef:使用 xlCoerce 查找实际的单元格值。 整数值存在溢出风险。boost::numeric_cast
对此有所帮助。
字符串编组很烦人。 xloper 使用 char,xloper12 使用 wchar,variant 使用 bstr。
记得释放为新的 xloper 字符串分配的缓冲区。相应地使用 xlbitDLLFree 和 xlAutoFree(12)。
模板编程对于 xloper/xloper12 问题很有用。升压有帮助。 _bstr_t 也有帮助。
【讨论】:
我可以离线联系你吗?这?我有一个用 C++ 编写的 UDF,它需要通过将其存储到 XLOPER 中来返回一个二维变量数组。光是想想就做噩梦。 @Dilip,将其作为问题发布在 SO 上。我(或其他人)可以回答。我很乐意为您提供帮助;我只是更愿意公开答案,以便将来帮助其他人。【参考方案2】:我使用 XLL Plus(费用) http://www.as-ltd.co.uk/xllplus/default.htm
还有 XLW(开源) http://xlw.sourceforge.net/
可能还有其他我不知道的
【讨论】:
以上是关于如何在 XLOPER 和 VARIANT 之间编组? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?
在 c# 和 c++ 之间将 double 类型的二维多维数组作为输入和输出的 pinvoke 编组