【问题标题】:COM interfaces declared in C++在 C++ 中声明的 COM 接口
【发布时间】:2012-06-05 02:35:49
【问题描述】:

通常要创建 COM 接口,应在 IDL 文件中声明它。在我从事的项目中,我在 C++ 的 *.h 文件中声明了一个 COM 接口:

struct DECLSPEC_UUID("A67177F7-A4DD-4A80-8EE1-25CF12172068") ISomeService : public IUnknown
{
    virtual ~ISomeService() {}

    virtual HRESULT Initialize(const Settings& settings) = 0;

    // ...
};

此外,Initialize 方法采用包含 std::string 字段的结构作为其参数。 相应的 COM 类是用 C++ 实现的,并且可以从另一个 C++ 模块中使用。 这工作正常,直到我在 AppVerifier 下运行代码。它会导致发生访问冲突异常。

所以我的问题是

  1. 有时在 *.h 文件中声明 COM 接口是否正确?
  2. 如果是,是否可以将 C++ 类型指定为 COM 接口方法的参数?或者在这种情况下我应该始终使用符合 COM 标准的类型(BSTR 等)吗?

【问题讨论】:

  • 我从未见过只在 .h 文件中定义的 COM 接口。 CoClass 在哪里定义?无论如何,如果您使用的是自定义类,COM 应该知道这个类,以便它可以编组这个类,以便数据从调用者正确传递到被调用方法。请参阅此链接 (progtutorials.tripod.com/COM.htm) 中的第 5.5 节,了解如何实现此目的。
  • @Unni:为什么要 coclass?这是一个界面。

标签: c++ com marshalling


【解决方案1】:
  1. 当然,您可以在不使用 IDL 的情况下描述 COM 接口。但是您将无法使用诸如类型库和编组代码生成之类的 IDL 功能。但是,如果您仅将 COM 组件用作进程内服务器 (DLL),并且您可以将 .h 文件分发给客户端 - 那么这种方法可以正常工作。

  2. 避免在接口中使用 C++ 类型,因为在处理跨 DLL 边界的内存时可能会导致访问冲突。最好使用纯 C 类型或 COM 类型

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2020-03-02
    • 2011-02-26
    • 2010-09-24
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多