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

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下运行代码,此方法才能正常工作。这将导致发生访问冲突异常。

所以我的问题是
  • 有时在* .h文件中声明COM接口(interface)是否正确?
  • 如果可以,将C++类型指定为COM接口(interface)方法的参数是否正确?还是在这种情况下(BSTR等)是否应始终使用COM兼容类型?
  • 最佳答案

  • 当然,您可以在不使用IDL的情况下描述COM接口(interface)。但是您将无法使用类型库和编码代码生成之类的IDL功能。但是,如果您将COM组件仅用作进程内服务器(DLL),并且可以将.h文件分发给客户端,则可以使用这种方法。
  • 避免在接口(interface)中使用C++类型,因为跨DLL边界处理内存时可能会导致访问冲突。更好地使用普通C类型或COM类型
  • 关于c++ - 用C++声明的COM接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10883150/

    10-11 23:04
    查看更多