我已经继承了一个包含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的可以通过明确的类型来代替。
看起来像你继承了我的项目。对不起:p所以VARIANT基本上是泛型类型,可以是任何东西。他们就像在C#中的对象。这个想法是,这些类型可以在运行时改变。这样可以使你的接口与运行时类型绑定语言(如VB,C#等)兼容。 – thang 2013-02-19 17:33:53
那么,首先检查代码中的错误处理。不错,如果它通过IErrorInfo生成一个友好的错误消息。如果将它留给IDispatch库存实现,那么在传递错误类型的变量时获得的DISP_E_BADVARTYPE,“Bad变量类型”不是最大的。通过描述最常用于此服务器的脚本语言来获得更好的答案。 – 2013-02-20 01:34:53
只有C++应用程序使用此COM服务器。 – 2013-02-20 15:34:43