我维护一个可以通过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'
, 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);
有问题的coclass实现了从IDispatch下降的单个接口。
在与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
指针),相反 - 假设它能够做到这一点,这是猜测。
这是所有猜测,因为这段代码和它的复杂性在这一点上落后于我几年。但是,我希望它可以帮助任何未来的读者。
彼得的答案应该有效,但你可能想要尝试的是 NaN
这是Matlab通常使用的 NULL
值。
来自 数学文档,你可以使用 libpointer
功能:
p = libpointer;
接着 p
将是一个 NULL
指针。有关详细信息,请参阅该页面。
也可以看看: 有关libpointer的更多信息。
在与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
指针),相反 - 假设它能够做到这一点,这是猜测。
这是所有猜测,因为这段代码和它的复杂性在这一点上落后于我几年。但是,我希望它可以帮助任何未来的读者。
彼得的答案应该有效,但你可能想要尝试的是 NaN
这是Matlab通常使用的 NULL
值。
来自 数学文档,你可以使用 libpointer
功能:
p = libpointer;
接着 p
将是一个 NULL
指针。有关详细信息,请参阅该页面。
也可以看看: 有关libpointer的更多信息。
除了使用[]和libpointer(由Peter建议)之外,您还可以尝试{}。
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对象接口。