VARIANT在COM接口中的独占使用

The exclusive use of VARIANT in a COM interface

本文关键字:COM 接口 VARIANT      更新时间:2023-10-16

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

以下是我的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);
};

非常感谢。

编辑:

为了清楚起见,所有这些VARIANT都可以用显式类型来代替。

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

您的接口派生自IDispatch,这意味着它是一个双接口-您可以直接从接口调用方法,也可以通过iDispatch::Invoke调用它们。传递给Invoke的参数都必须是VARIANTARG类型,这只是VARIANT的另一个名称,请参阅http://msdn.microsoft.com/en-us/library/ms891678.aspx.

对于某些类型的双接口,假设可以使用VB和脚本语言,最好使用直接类型的VARIANT。例如,最好在几乎所有类型的SAFEARRAY和接口指针上使用VARIANT。但你可以试试看。