如何在 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 之间编组? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

/MD 和 /MT 运行时库之间的编组

在 C++ 和 C# 之间编组类实例的指针

Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?

在 c# 和 c++ 之间将 double 类型的二维多维数组作为输入和输出的 pinvoke 编组

VBA:Variant/Double 和 Double 之间的区别

在 C#/C++ 之间编组复杂结构