【问题标题】:The exclusive use of VARIANT in a COM interfaceVARIANT 在 COM 接口中的专有使用
【发布时间】: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 服务器。

标签: c++ windows com idl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以要具备成为双接口的能力,接口中的所有参数都必须是VARIANT 类型? Invoke 不处理从VARIANT 到接口中描述的类型的编组?
    • IDispatch::Invoke() 应该做所有的编组。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-30
      • 2017-11-25
      • 2013-09-22
      • 2016-11-21
      • 2012-01-04
      • 1970-01-01
      • 2011-02-12
      • 2017-07-18
      • 2018-08-13
      相关资源
      最近更新 更多