【问题标题】:Running a excel macro crash when passing a com variant传递 com 变体时运行 excel 宏崩溃
【发布时间】:2020-04-23 18:24:18
【问题描述】:

在运行我们的应用程序时,它在以下代码行中崩溃, *pResult = g_pExcel->Run(Temp1,argVariant);

下面是代码。我无法找到它崩溃的原因。有没有类型转换问题?

CExec::CallRunVbtFunc(BSTR MacroName,
                        SAFEARRAY** ArgVals,
                        int *pResult)
  {

      _bstr_t Temp1 (MacroName);

      CComVariant argVariant(*ArgVals);
      argVariant.vt = VT_ARRAY | VT_BSTR;

      *pResult = g_pExcel->Run(Temp1,
                               argVariant);

      return S_OK;
  }

Public Function MyTesting() As Long
    Dim aa(1) As String
    aa(0) = "aaa"
    aa(1) = "bbb"        

    TheExec.CallRunVbtFunc "Macro3", aa

    End Function

Sub Macro3(argc As String, argv As String)

    TheExec.WriteComment "Called Macro2 with args*************** "

End Sub

【问题讨论】:

  • Excel->Run 采用类似 Run(MacroName, arg1, arg2, arg3, ......) 的参数。但是在这里我们将 argVariant(其中有 2 个值)作为参数传递。所以我认为这就是问题所在。如何拆分并传递值。
  • 如果您在 C++ 代码中使用了#import,那么您就不能真正跳过 try/catch 来诊断 _com_error 异常。

标签: c++ excel vba com


【解决方案1】:
  1. Run Methode 只接受 VARIANT 参数,不接受数组。见MSDN

  2. 与所有其他 VB 脚本语言和 OLE 自动化一样,Excel 只能处理安全的 VARIANT 数组。请检查您的 SAFEARRAY 是否真的属于这种类型 (SafeArrayGetVartype)。否则需要将数组转置为 VT_ARRAY|VT_VARIANT 安全数组!

【讨论】:

  • 是的。传递给 run 方法的参数是一个变体(argVariant 是 CComVariant 类型)。它也被转置为数组 argVariant.vt = VT_ARRAY | VT_BSTR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多