在 C++ 中声明的 COM 接口

COM interfaces declared in C++

本文关键字:COM 接口 声明 C++      更新时间:2023-10-16

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

struct DECLSPEC_UUID("A67177F7-A4DD-4A80-8EE1-25CF12172068") ISomeService : public IUnknown
{
    virtual ~ISomeService() {}
    virtual HRESULT Initialize(const Settings& settings) = 0;
    // ...
};

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

所以我的问题是

  1. 有时在 *.h 文件中声明 COM 接口是否正确?
  2. 如果是,将C++类型指定为 COM 接口方法的参数是否正确?还是在这种情况下我应该始终使用 COM 兼容类型(BSTR 等)?
  1. 当然,您可以在不使用 IDL 的情况下描述 COM 接口。但是,您将无法使用诸如类型库和编组代码生成之类的 IDL 功能。但是,如果您仅将 COM 组件用作进程内服务器 (DLL),并且可以将 .h 文件分发到客户端 - 那么此方法将正常工作。

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