什么';当它';正在调用COM/ActiveX方法吗?

什么';当它';正在调用COM/ActiveX方法吗?,com,matlab,parameters,automation,null,Com,Matlab,Parameters,Automation,Null,我维护一个可以通过COM实现自动化的程序。通常,客户使用VBS编写脚本,但我们有几个客户使用Matlab的ActiveX支持,并且在使用空参数调用COM对象方法时遇到问题 他们问我如何在Matlab中实现这一点,而我已经搜索了一天左右的时间,但仍然无法理解 他们的示例代码可能如下所示: function do_something() OurAppInstance = actxserver('Foo.Application'); OurAppInstance.Method('Hello

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

他们问我如何在Matlab中实现这一点,而我已经搜索了一天左右的时间,但仍然无法理解

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

function do_something()
   OurAppInstance = actxserver('Foo.Application');
   OurAppInstance.Method('Hello', NULL)
end
其中,
NULL
是在另一种语言中,我们可以编写
NULL
nil
Nothing
,当然,也可以传入一个对象。问题是这是可选的(在大多数情况下,这些都是作为可选参数实现的,但并非所有情况下都是如此)——这些方法经常希望得到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下降的单个接口。

从,您可以使用
libpointer
函数:

p = libpointer;
然后
p
将是
NULL
指针。有关更多详细信息,请参阅该页


另请参见:。

Peter的答案应该有效,但您可能想尝试的是
NaN
,这是Matlab通常用作
NULL
值的方法。

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

对于VB中需要
Nothing
参数的某些内容,正确的答案是以某种方式获得一个COM/ActiveX
变量,该变量的变量类型为
VT\u EMPTY
。(请参见Visual Basic的哪个引用封送处理行为
Nothing

MATLAB可以用空数组(
[]
)来实现这一点,但我不确定。。。。因此,这可能不可能完全在MATLAB中实现。尽管有人可以很容易地编写一个小型COM库,其目的是创建一个VT_为空的变体

但是,如果参数具有
[optional]
属性,并且希望将该可选参数保留为空,则不应执行此操作。请参见VT_EMPTY下的说明:

VT_EMPTY:未指定任何值。如果自动方法的可选参数留空,请不要传递类型为VT_EMPTY的变量。相反,传递类型为VT_ERROR的变量,其值为DISP_E_PARAMNOTFOUND


Matlab应该(但可能不)提供创建这些对象的方法(一个“无”和一个“可选空白”),这样您就可以正确地与COM对象交互。

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

详细说明:Matlab确实支持可选参数,但不支持传入变量空指针(实际上,为了准确了解VB的
Nothing
如何工作,我认为a
VT_EMPTY
变量),无论是否作为可选参数。有一些关于null/pointerish类型的文档,其中很多在我的问题或各种回答中都提到过,但它们似乎不适用于COM支持

Matlab支持人员为我提供了一个解决方案,使用他们创建的COM DLL和Excel创建一个可以在脚本中传递的虚拟nothing对象。我还没有设法让这个变通方法/黑客程序正常工作,即使我不幸地做到了,我也可能无法重新发布它。但是,如果您遇到相同的问题,此描述至少可以为您提供一个起点

编辑 有可能是相关的。(我不再使用有问题的源代码或Matlab来刷新内存或进行测试。)

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


这都是猜测,因为这段代码和它的复杂性在这一点上已经落后我好几年了。不过,我希望它能对未来的读者有所帮助。

谢谢彼得。有问题的客户说他试过这个,但没有成功。我已经用错误信息和特定方法签名的更多信息更新了这个问题。我需要传递一个null,这就像治疗一样,但这对我不起作用。它对签名发脾气了。不过,彼得的回答确实起了作用。我需要传递一个空对象。