C++ 变量在COM接口中的独占使用

C++ 变量在COM接口中的独占使用,c++,windows,com,idl,C++,Windows,Com,Idl,我继承了一个包含COM DLL的项目。我对COM有点陌生,但似乎有些不对劲。IDL中定义的接口仅对所有属性和方法返回/参数使用变量类型。这有什么可能的理由吗?我有一种感觉,以前的开发人员只是在做一些事情,但我想确定一下 我的IDL是这样的: interface IMyComInterface : IDispatch { [id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg);

我继承了一个包含COM DLL的项目。我对COM有点陌生,但似乎有些不对劲。IDL中定义的接口仅对所有属性和方法返回/参数使用
变量
类型。这有什么可能的理由吗?我有一种感觉,以前的开发人员只是在做一些事情,但我想确定一下

我的IDL是这样的:

interface IMyComInterface : IDispatch
{
    [id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg);
    [id(2), helpstring("method CheckFolder")] HRESULT CheckFolder([in] VARIANT Folder, [out] VARIANT *pCount, [out, retval] VARIANT *pErrorCount);
    [propget, id(3), helpstring("property Flags")] HRESULT Flags([out, retval] VARIANT *pVal);
    [propput, id(3), helpstring("property Flags")] HRESULT Flags([in] VARIANT newVal);
    [propget, id(4), helpstring("property MessageStore")] HRESULT MessageStore([out, retval] VARIANT *pVal);
    [propput, id(4), helpstring("property MessageStore")] HRESULT MessageStore([in] VARIANT newVal);
    [propget, id(5), helpstring("property Directory")] HRESULT Directory([out, retval] VARIANT *pVal);
    [propput, id(5), helpstring("property Directory")] HRESULT Directory([in] VARIANT newVal);
    [propget, id(6), helpstring("property MessageCount")] HRESULT MessageCount([out, retval] VARIANT *pVal);
};
非常感谢

编辑:


为了清楚起见,所有这些变量都可以被显式类型所取代。

对于假定与
VB
和脚本语言一起工作的某些类型的双接口,最好使用直接类型的
VARIANT
。例如,最好在几乎所有类型的
SAFEARRAY
和接口指针上使用
VARIANT
。但您可以测试并查看。

如果您需要性能或简化,您可以更改变量类型以获得适当的值,更接近所使用的类型。记住,这是一个接口中断。
查看要使用的有效值:

您的接口源自
IDispatch
,这意味着它是一个双接口-您可以直接从接口调用方法,也可以通过调用方法。传递给
Invoke
的参数必须全部为
VARIANTARG
类型,这只是
VARIANT
的另一个名称,请参见。

看起来您继承了我的项目。抱歉:p所以变体基本上是泛型类型,可以是任何类型。它们就像c#中的对象。其思想是这些类型可以在运行时更改。这样,您的界面就可以与运行时类型绑定语言(如VB、C#等)兼容。如果它通过IErrorInfo生成友好的错误消息,那就很好了。如果由IDispatch stock实现决定,那么在传递错误类型的变量时得到的DISP_E_BADVARTYPE,“Bad variable type”不是最大的。通过描述这个服务器最常用的脚本语言,得到一个更好的答案。只有C++应用程序使用这个COM服务器。所以要有一个双重接口的能力,接口中的所有参数都必须是“代码>变体< /代码>?”code>Invoke不处理从
VARIANT
到接口中描述的类型的封送处理?IDispatch::Invoke()应该执行所有封送处理。