我维护一个可以通过 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
在另一种语言中,我们会写成 NULL
或 nil
或 Nothing
,或者,当然是传入一个对象。问题是这是可选的(在大多数情况下,这些都是作为可选参数实现的,但不是所有)——这些方法期望经常得到 NULL。
他们告诉我他们已经尝试了 []
(从我的阅读来看这似乎是最有可能的)以及 ''
,Nothing
、'Nothing'
、None
、Null
和 0
。我不知道其中有多少甚至是有效的 Matlab 关键字 - 在这种情况下肯定没有用。
有人可以帮忙吗?用作 COM 方法参数的空指针/对象的 Matlab 语法是什么?
更新:感谢您到目前为止的所有回复!不幸的是,所有答案似乎都不起作用,甚至 libpointer
也不行。在所有情况下错误都是相同的:
错误:类型不匹配,参数 2
COM类型库中的这个参数在RIDL中描述为:
HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);
有问题的 coclass 实现了从 IDispatch 继承的单个接口(interface)。
最佳答案
在与 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
指针的变体),而不是 - 假设它能够做到这一点,这是猜测。
这都是猜测,因为这段代码及其错综复杂的细节在我看来已经过去好几年了。不过,我希望它能对 future 的读者有所帮助。
关于com - 当调用 COM/ActiveX 方法时,NULL 的 Matlab 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278376/