2013-02-19 53 views
-1

我已经继承了一个包含COM DLL的项目。我对COM很陌生,但看起来并不正确。在IDL中定义的接口仅对所有属性和方法返回/参数使用VARIANT类型。有没有任何可能的理由呢?我有一种感觉,以前的开发人员只是在谈一些事情,但我想确定。在COM接口中独占使用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 S的可以通过明确的类型来代替。

+0

看起来像你继承了我的项目。对不起:p所以VARIANT基本上是泛型类型,可以是任何东西。他们就像在C#中的对象。这个想法是,这些类型可以在运行时改变。这样可以使你的接口与运行时类型绑定语言(如VB,C#等)兼容。 – thang 2013-02-19 17:33:53

+0

那么,首先检查代码中的错误处理。不错,如果它通过IErrorInfo生成一个友好的错误消息。如果将它留给IDispatch库存实现,那么在传递错误类型的变量时获得的DISP_E_BADVARTYPE,“Bad变量类型”不是最大的。通过描述最常用于此服务器的脚本语言来获得更好的答案。 – 2013-02-20 01:34:53

+0

只有C++应用程序使用此COM服务器。 – 2013-02-20 15:34:43

回答

0

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

1

如果您需要性能或简化,请将VARIANT类型更改为适当的值,与使用的类型更接近。请记住,它是一个接口中断。
查看有效值使用:
COM Data Types

1

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

+0

那么为了能够成为一个双接口,接口中的所有参数必须是'VARIANT'类型? 'Invoke'不处理从'VARIANT'到接口中描述的类型的封送处理? – 2013-02-20 01:03:57

+0

IDispatch :: Invoke()应该做所有的编组。 – Luke 2013-02-20 17:54:50