【问题标题】:What's the Matlab equivalent of NULL, when it's calling COM/ActiveX methods?当调用 COM/ActiveX 方法时,Matlab 的 NULL 等价物是什么?
【发布时间】:2011-01-17 17:08:45
【问题描述】:

我维护了一个可以通过 COM 自动化的程序。通常客户使用 VBS 来编写脚本,但我们有几个客户使用 Matlab 的 ActiveX 支持并且在使用 NULL 参数调用 COM 对象方法时遇到了问题。 p>

他们问过他们是如何在 Matlab 中做到这一点的 - 我已经在 Mathworks' COM/ActiveX documentation 上搜索了一天左右,但无法弄清楚。

他们的示例代码可能如下所示:

function do_something()
   OurAppInstance = actxserver('Foo.Application');
   OurAppInstance.Method('Hello', NULL)
end

NULL 是另一种语言的位置,我们可以写成NULLnilNothing,当然,也可以传入一个对象。问题是这是可选的(在大多数情况下,这些都是作为可选参数实现的,但不是全部)——这些方法经常会得到 NULL。

他们告诉我他们已经尝试过[](从我的阅读来看最有可能)以及''Nothing'Nothing'NoneNull0 .我不知道其中有多少是有效的 Matlab 关键字——在这种情况下肯定没有。

有人可以帮忙吗?用作 COM 方法参数的空指针/对象的 Matlab 语法是什么?

更新:感谢您迄今为止的所有回复!不幸的是,似乎没有一个答案有效,甚至libpointer。错误在所有情况下都是一样的:

Error: Type mismatch, argument 2

COM 类型库中的这个参数在 RIDL 中被描述为:

    HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);

有问题的 coclass 实现了从 IDispatch 下降的单个接口。

【问题讨论】:

    标签: com matlab parameters automation null


    【解决方案1】:

    在与 Matlab 技术支持人员交谈后,我在这里回答了我自己的问题:没有 Nothing 的等价物,Matlab 不支持这个。

    详细说明:Matlab 确实支持可选参数,但不支持传入变体 NULL 指针(实际上,要准确遵循 VB 的 Nothing 的工作原理,我认为是 VT_EMPTY 变体)是否作为可选参数.有关于一些空/指针类型的文档,其中很多在我的问题或各种答案中都提到了,但这些似乎不适用于它们的 COM 支持。

    Matlab 支持使用他们创建的 COM DLL 和 Excel 为我提供了一个解决方法,以创建一个可以在脚本中传递的虚拟对象。我还没有设法让这个解决方法/黑客工作,即使我很遗憾我也可能无法重新分发它。但是,如果您遇到同样的问题,此描述至少可以为您提供一个起点!

    编辑

    this Old New Thing blog post可能可能是相关的。 (我不再使用访问有问题的源代码或访问 Matlab 来刷新我的记忆或进行测试。)

    简而言之,对于IUnknown(或派生的)参数,您需要一个[unique] 属性才能使它们合法地成为NULL。上述声明要求 Matlab 创建或传入 VT_EMPTY 变体,但它无法做到。也许添加 [unique] 可能会提示 Matlab 引擎传入 NULL 指针(或包含 NULL 指针的变体),而不是 - 假设它能够做到这一点,这是猜测。

    这都是猜测,因为此时此代码及其复杂性已落后我数年。不过,我希望它对任何未来的读者有所帮助。

    【讨论】:

      【解决方案2】:

      mathworks documentation,你可以使用libpointer函数:

      p = libpointer;
      

      然后p 将是一个NULL 指针。有关详细信息,请参阅该页面。

      另请参阅:more information about libpointer

      【讨论】:

      • 谢谢彼得。有问题的客户说他试过这个,但没有用。我已经用有关错误信息和特定方法签名的更多信息更新了问题。
      • 我需要传递一个空值,这就像一种享受
      【解决方案3】:

      Peter 的回答应该可行,但您可能想尝试的是 NaN,这是 Matlab 通常用作 NULL 值的东西。

      【讨论】:

      • 这对我不起作用。它对签名很生气。不过,彼得的回答确实有效。我需要传递一个空对象。
      【解决方案4】:

      除了使用 [] 和 libpointer(如 Peter 建议的那样)之外,您还可以尝试 {}。

      【讨论】:

        【解决方案5】:

        对于 VB 中需要 Nothing 参数的东西的正确答案是,以某种方式获得具有变体类型 VT_EMPTY 的 COM/ActiveX Variant。 (请参阅 MSDN docs,其中引用了 Visual Basic Nothing 的封送处理行为)

        MATLAB 可以对空数组 ([]) 执行此操作,但我不确定....所以纯粹在 MATLAB 中可能无法实现。尽管有人可以轻松编写一个小型 COM 库,其目的是创建一个带有 VT_EMPTY 的 Variant。

        但如果参数具有[optional] 属性,并且您想将该可选参数留空,则应该这样做。请参阅 VT_EMPTY 下的COM/ActiveX docs on Variants

        VT_EMPTY:未指定任何值。如果自动化方法的可选参数留空,则不要传递 VT_EMPTY 类型的 VARIANT。而是传递值为 DISP_E_PARAMNOTFOUND 的 VT_ERROR 类型的 VARIANT。

        Matlab 应该(但可能不)提供创建这些对象的方法(“无”和“可选空白”),以便您可以与 COM 对象正确交互。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-09
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多