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

时间:2010-02-17 04:45:26

标签: com matlab parameters automation null

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

他们已经问过他们是如何在Matlab中做到这一点的 - 而且我现在已经淘汰了Mathworks' COM/ActiveX documentation一天左右,现在无法解决这个问题。

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

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

其中NULL是另一种语言的位置,我们会写NULLnilNothing,或者当然会传入一个对象。问题是这是可选的(并且这些在大多数情况下都是作为可选参数实现的,但并非所有,情况) - 这些方法经常会出现NULL。

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

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

更新:感谢目前为止的所有回复!不幸的是,没有一个答案似乎有效,甚至没有0。在所有情况下错误都是相同的:

libpointer

COM类型库中的此参数在RIDL中描述为:

Error: Type mismatch, argument 2

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

5 个答案:

答案 0 :(得分:8)

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

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

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

修改

this Old New Thing blog post 可能与相关。 (我不再能够访问有问题的源代码,或访问Matlab,刷新内存或进行测试。)

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

这是所有猜测,因为此代码和它的复杂性在此时已经过去了几年。但是,我希望它可以帮助任何未来的读者。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

mathworks documentation,您可以使用libpointer功能:

p = libpointer;

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

另请参阅:more information about libpointer

答案 3 :(得分:1)

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

答案 4 :(得分:1)

VB中预期Nothing参数的正确答案是以某种方式获得变体类型为Variant的COM / ActiveX VT_EMPTY。 (请参阅MSDN docs,它引用了Visual Basic Nothing的编组行为)

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

但是如果参数具有[optional] atttribute,并且您希望将该可选参数留空,则应该执行此操作。请参阅VT_EMPTY下的COM/ActiveX docs on Variants

  

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

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