【问题标题】:Convert enum to _variant_t C++将枚举转换为 _variant_t C++
【发布时间】:2017-02-05 08:07:54
【问题描述】:

我正在编写一个 COM 客户端。我的 COM 服务器中的一个函数将枚举作为参数并返回一个数字(长) 看起来像这样:

函数 GetFlowsheetStatus(iQueryFlags As FlowSheetObjStatusFlag_enum) 只要 我同时使用早期和后期绑定(IDispatch 和直接接口)所以我写了类似的东西:FlowSheetObjStatusFlag_enum flag;_variant_t p = _variant_t(flag);

所以我需要将枚举“FlowSheetObjStatusFlag_enum”转换为 _variant_t 才能通过它。我该怎么做?

【问题讨论】:

  • 是什么让您认为必须将其转换为变体?加上“看起来像这样”的例子看起来像 VBA 或 VB6,而不是 C++,但你要求 C++;你能澄清一下吗?
  • 感谢您的评论。我试图传递除变体以外的任何东西,HRESULT 返回错误。该示例来自用 VBA 编写的 COM 服务器文档。
  • 使用 VBA 签名,使用 Variant 是错误的。除非您通过自动化(调用 IDispatch 方法)使用该库,否则您没有提到并且是困难的方法;或者如果这个例子是在撒谎(总是可能的)。假设这个例子没有说谎,而且这是 C++,你只能传递正确的数据类型,否则它甚至不会编译,所以我对“返回错误”感到困惑。要传递的正确“枚举”定义取决于您如何将类型库合并到 C++ 代码中。例如,如果您使用了#import,请检查生成的 C++ 文件以确定枚举类型的名称。
  • 谢谢。我的错误是我创建了自己的枚举类型并想通过自动化传递它。我使用 IDispatch 方法。我通过找到服务器公开的枚举解决了这个问题。我的错误是为此编写了一个相同的枚举。
  • 我同时使用早期和后期绑定(IDispatch 和直接接口)所以我写了类似的东西:FlowSheetObjStatusFlag_enum flag;_variant_t p = _variant_t(flag);我仍然有错误,但我认为它们的起源在其他地方(希望如此)

标签: c++ enums com typeconverter


【解决方案1】:

我自己并不熟悉 COM,但 C++ 确实允许从一种类型转换为另一种类型。

  • static_cast 将一种类型转换为另一种兼容类型
    (即intdouble
  • dynamic_cast 用于将基类型向下转换为派生类型
  • reinterpret_cast 应该在您绝对需要使用它时使用。它接受一个类型并说“它不是这种类型,而是把它当作这个。”
    (即int x = reinterpret_cast<int>(std::string{"my string hello"});
  • const_cast 主要用于远离 const-ness,但也可用于赋予 const-ness。我想我还是会在这里列出它的深度。

有关更多详细信息,您应该阅读以下内容:http://en.cppreference.com/w/cpp/language/explicit_cast

【讨论】:

    【解决方案2】:

    我的错误是我创建了自己的枚举类型并希望通过自动化传递它。我通过找到服务器公开的枚举解决了这个问题。我的错误是为此编写了一个相同的枚举。我猜公开的枚举已经兼容,因为它是通过服务器发起的。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 2021-01-04
      • 2015-06-10
      相关资源
      最近更新 更多