我维护一个可以通过COM自动化的程序。通常客户使用VBS来编写脚本,但是我们有几个客户使用 Matlab的ActiveX支持并且在使用NULL参数调用COM对象方法时遇到了麻烦。
他们已经问过他们是如何在Matlab中做到这一点的 - 而且我现在已经淘汰了Mathworks' COM/ActiveX documentation一天左右,现在无法解决这个问题。
他们的示例代码可能如下所示:
function do_something()
OurAppInstance = actxserver('Foo.Application');
OurAppInstance.Method('Hello', NULL)
end
其中NULL
是另一种语言的位置,我们会写NULL
或nil
或Nothing
,或者当然会传入一个对象。问题是这是可选的(并且这些在大多数情况下都是作为可选参数实现的,但并非所有,情况) - 这些方法经常会出现NULL。
他们告诉我他们已尝试[]
(从我的阅读中看起来最有可能)以及''
,Nothing
,'Nothing'
,{{1} },None
和Null
。我不知道其中有多少甚至是有效的Matlab关键字 - 在这种情况下肯定没有用。
有人可以帮忙吗?什么是Matlab的空指针/对象的语法用作COM方法参数?
更新:感谢目前为止的所有回复!不幸的是,没有一个答案似乎有效,甚至没有0
。在所有情况下错误都是相同的:
libpointer
COM类型库中的此参数在RIDL中描述为:
Error: Type mismatch, argument 2
有问题的coclass实现了一个从IDispatch下降的单一接口。
答案 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)
答案 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对象接口。