在C ++中声明的COM接口

时间:2012-06-04 14:38:12

标签: c++ com marshalling

通常要创建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接口方法的参数是正确的吗?或者我应该在这种情况下(BSTR等)使用COM兼容类型吗?

1 个答案:

答案 0 :(得分:3)

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

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