Dav*_*vid 14 com parameters null matlab automation
我维护一个可以通过COM自动化的程序.通常客户使用VBS来编写脚本,但我们有几个客户使用Matlab的ActiveX支持,并且在使用NULL参数调用COM对象方法时遇到问题.
他们已经问过他们是如何在Matlab中做到这一点的 - 而且我已经在Mathworks的COM/ActiveX文档中搜索了一天左右,现在无法弄明白.
他们的示例代码可能如下所示:
function do_something()
OurAppInstance = actxserver('Foo.Application');
OurAppInstance.Method('Hello', NULL)
end
Run Code Online (Sandbox Code Playgroud)
这里NULL
就是另一种语言,我们会写NULL
或nil
或Nothing
或,当然,传中的对象.问题是这是可选的(并且这些在大多数情况下都是作为可选参数实现的,但并非所有情况都是如此) - 这些方法经常会出现NULL.
他们告诉我,他们已经尝试过[]
(从我的阅读似乎是最有可能的),以及''
,Nothing
,'Nothing'
,None
,Null
,和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);
Run Code Online (Sandbox Code Playgroud)
有问题的coclass实现了从IDispatch下降的单个接口.
在与Matlab技术支持人员交谈后,我在这里回答了我自己的问题:没有相应的Nothing
,Matlab不支持这一点.
详细说明:Matlab确实支持可选参数,但不支持传入变量NULL指针(实际上,为了完全遵循VB的Nothing
工作方式VT_EMPTY
,我认为是一种变体)是否作为可选参数.有关于某些null/pointerish类型的文档,我的问题或各种答案中提到了很多这些类型,但这些似乎不适用于它们的COM支持.
我通过Matlab支持使用他们创建的COM DLL和Excel来创建一个可以在脚本中传递的虚拟对象.我没有设法让这个解决方法/黑客工作,即使我不幸的是我可能无法重新分发它.但是,如果遇到同样的问题,这个描述可能至少会给你一个起点!
很可能这个旧的新的博客文章 可能是相关的.(我不再能够访问有问题的源代码,或访问Matlab,刷新内存或进行测试.)
简而言之,对于IUnknown
(或派生的)参数,您需要[unique]
合法的属性NULL
.上述声明要求Matlab创建或传递一个VT_EMPTY
它无法做到的变体.也许添加[unique]可能会促使Matlab引擎传入NULL
指针(或包含NULL
指针的变体),而不是 - 假设它能够做到这一点,这就是猜测.
这是所有猜测,因为此代码和它的复杂性在这一点上落后于我几年.但是,我希望它可以帮助任何未来的读者.
从mathworks 文档中,您可以使用该libpointer
函数:
p = libpointer;
Run Code Online (Sandbox Code Playgroud)
然后p
将是一个NULL
指针。有关更多详细信息,请参阅该页面。
另请参阅:有关 libpointer 的更多信息。