我正在为应用程序实现COM自动化(双接口)。自动化界面将从VBScript调用。我不清楚该方法的参数允许使用哪些类型。我知道基本值必须符合VARIANT
,但是这是否意味着所有类型为int
的参数都必须通过VARIANT
,或者可以直接通过int
?在COM自动化接口中允许“输出”参数类型
例如,两种方法我在MIDL文件是:
HRESULT SetDate([in] int Year, [in] int Month, [in] int Day);
HRESULT GetDate([out] int* pYear, [out] int* pMonth, [out] int* pDay);
调用SetDate
从VBScript工作。如图所示调用GetDate
失败,也就是说,在C++的实现中,ITypeInfo::Invoke
返回一个指示类型错误的代码。
我观察到,如果使用VARIANT而不是int,如下所示,它可以工作。
HRESULT GetDate([out] VARIANT* pYear, [out] VARIANT* pMonth, [out] VARIANT* pDay);
所以是int
不允许参数(因为双界面),或者我必须做别的事情了?如果不允许int
,为什么SetDate
工作 - 在这方面的输入参数和输出参数之间是否存在差异?
此外,这对方法的工作原理,虽然两者使用int
:
[propget] HRESULT System([out, retval] int* pSystem);
[propput] HRESULT System([in] int System);
为什么 - 是规则的属性不同的允许的参数类型,或当参数被声明为retval
?
我不太明白这一切 - 如果有人能澄清这一点,将不胜感激。
感谢您的答复。我没有使用ATL,只是简单的C++。如果我将[out]改为[out,ref],是否应该起作用? – Dabbler 2013-05-13 05:47:50
你真的在实现你自己的'Invoke'吗?这是一个重要的细节;你应该加上这个问题。原则上,您可以编写一个'Invoke'的实现,它接受vbscript提供的'VARIANT'并将其转换为您的方法的int *'(如果可以,或者返回错误,否则返回)。然后,您的调用将负责获取参数的返回值,并将其填充到脚本客户端提供的参数(如果可以,或者如果不可以,则放弃它)。这是一项不重要的工作量 - 客户可以向您传递任何信息,并且您需要为此做好准备。 – 2013-05-13 22:39:51
注意:当我打算说'[in,out]'时,我的文章的早期版本使用'[ref]' - 一个愚蠢的滑倒。 – 2013-05-13 22:54:24