问题 什么是Matlab相当于NULL,当它调用COM / ActiveX方法时?


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

他们已经问过他们是如何在Matlab中做到这一点的 - 而且我一直在搜索 Mathworks的COM / ActiveX文档 现在已经一天左右,无法弄明白。

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

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

哪里 NULL 我们写的是用另一种语言写的地方 NULL 要么 nil 要么 Nothing,或者,当然,传递一个对象。问题是这是可选的(并且这些在大多数情况下都是作为可选参数实现的,但是 不是全部,case) - 这些方法经常会出现NULL。

他们告诉我他们已经尝试过了 [] (从我的阅读中看起来最有可能)以及 ''Nothing'Nothing'NoneNull,和 0。我不知道其中有多少甚至是有效的Matlab关键字 - 在这种情况下肯定没有用。

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

更新: 感谢所有回复!不幸的是,没有一个答案似乎有效,甚至没有 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下降的单个接口。


6204
2018-02-17 04:45


起源



答案:


在与Matlab技术支持人员交谈后,我在这里回答了我自己的问题: 没有相当于 Nothing,Matlab不支持这一点。

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

我通过Matlab支持使用他们创建的COM DLL和Excel来创建一个可以在脚本中传递的虚拟对象。我没有设法得到这个解决方法/黑客工作,即使我不幸的是我可能无法重新分发它。但是,如果您遇到同样的问题,这个描述可能至少会给您一个起点!

编辑

有可能的 这篇Old New Thing博客文章  可能 相关的。 (我不再能够访问有问题的源代码,或访问Matlab,刷新内存或进行测试。)

简而言之,对于 IUnknown (或派生)参数,你需要一个 [unique] 属于他们合法的 NULL。以上声明要求Matlab创建或传入 VT_EMPTY 变种,它无法做到。也许添加[unique]可能会促使Matlab引擎传入 NULL指针(或包含a的变体) NULL 指针),相反 - 假设它能够做到这一点,这是猜测。

这是所有猜测,因为这段代码和它的复杂性在这一点上落后于我几年。但是,我希望它可以帮助任何未来的读者。


6
2018-04-28 02:46





彼得的答案应该有效,但你可能想要尝试的是 NaN这是Matlab通常使用的 NULL 值。


5
2018-02-17 05:29





来自 数学文档,你可以使用 libpointer 功能:

p = libpointer;

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

也可以看看: 有关libpointer的更多信息


3
2018-02-17 04:55



谢谢彼得。有问题的顾客说他试过这个,但是没有用。我已经更新了有关错误信息和特定方法签名的更多信息的问题。 - David M


答案:


在与Matlab技术支持人员交谈后,我在这里回答了我自己的问题: 没有相当于 Nothing,Matlab不支持这一点。

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

我通过Matlab支持使用他们创建的COM DLL和Excel来创建一个可以在脚本中传递的虚拟对象。我没有设法得到这个解决方法/黑客工作,即使我不幸的是我可能无法重新分发它。但是,如果您遇到同样的问题,这个描述可能至少会给您一个起点!

编辑

有可能的 这篇Old New Thing博客文章  可能 相关的。 (我不再能够访问有问题的源代码,或访问Matlab,刷新内存或进行测试。)

简而言之,对于 IUnknown (或派生)参数,你需要一个 [unique] 属于他们合法的 NULL。以上声明要求Matlab创建或传入 VT_EMPTY 变种,它无法做到。也许添加[unique]可能会促使Matlab引擎传入 NULL指针(或包含a的变体) NULL 指针),相反 - 假设它能够做到这一点,这是猜测。

这是所有猜测,因为这段代码和它的复杂性在这一点上落后于我几年。但是,我希望它可以帮助任何未来的读者。


6
2018-04-28 02:46





彼得的答案应该有效,但你可能想要尝试的是 NaN这是Matlab通常使用的 NULL 值。


5
2018-02-17 05:29





来自 数学文档,你可以使用 libpointer 功能:

p = libpointer;

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

也可以看看: 有关libpointer的更多信息


3
2018-02-17 04:55



谢谢彼得。有问题的顾客说他试过这个,但是没有用。我已经更新了有关错误信息和特定方法签名的更多信息的问题。 - David M


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


1
2018-02-17 09:12





VB中正在期待的东西的正确答案 Nothing 参数,是以某种方式得到一个COM / ActiveX Variant 其变体类型为 VT_EMPTY。 (看到 MSDN文档 哪个引用Visual Basic的编组行为 Nothing

MATLAB 可能 用空数组做到这一点([]),但我不确定....所以它可能不可能纯粹在MATLAB中。虽然有人可以轻松编写一个小型COM库,其目的是使用VT_EMPTY创建Variant。

但如果论证有 [optional] atttribute,你想把那个可选参数留空,你应该  做这个。见 Variants上的COM / ActiveX文档 在VT_EMPTY下说:

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

MATLAB 应该 (但可能没有)提供创建这些对象的方法(“无”和“可选空白”),以便您可以正确地与COM对象接口。


1
2018-02-17 16:55