-1

我继承了一个包含 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);
};

非常感谢。

编辑:

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

4

3 回答 3

1

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

于 2013-02-19T18:45:28.453 回答
1

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

于 2013-02-19T18:01:20.683 回答
0

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

于 2013-02-19T16:50:02.760 回答