【发布时间】:2013-02-04 10:07:34
【问题描述】:
我继承了一个包含 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 都可以被显式类型替换。
【问题讨论】:
-
看起来你继承了我的项目。抱歉:p 所以 VARIANT 基本上是可以是任何东西的泛型类型。它们就像 c# 中的对象。这个想法是这些类型可以在运行时改变。这样您的界面就可以与运行时类型绑定语言(如 VB、C# 等)兼容。
-
好吧,先检查一下代码中的错误处理。如果它通过 IErrorInfo 生成友好的错误消息,那就太好了。如果您将其留给 IDispatch 库存实现,那么当传递错误类型的变量时,您会得到的 DISP_E_BADVARTYPE,“错误的变量类型”并不是最大的。通过描述此服务器最常用的脚本语言来获得更好的答案。
-
只有 C++ 应用程序使用这个 COM 服务器。