【问题标题】:How can I marshall between XLOPER and VARIANT? [closed]如何在 XLOPER 和 VARIANT 之间编组? [关闭]
【发布时间】:2023-04-05 06:28:01
【问题描述】:

我正在开发一个与 COM 对象通信的 Excel 插件 (XLL)。所以,我必须在 XLOPER 和 VARIANT 之间进行编组。我已经完成了大部分工作,但数组绝对是一种痛苦。我需要支持一维和二维数组。

我想之前已经有人处理过这个问题了。简化处理 VARIANT、SAFEARRAY 和 XLOPER(以及 XLOPER12)的最佳方法是什么?

【问题讨论】:

标签: c++ excel marshalling variant safearray


【解决方案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/

可能还有其他我不知道的

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2020-12-08
    • 2017-07-05
    • 2012-07-14
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多