通常要创建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下运行代码。它会导致发生访问冲突异常。
所以我的问题是
答案 0 :(得分:3)
当然,您可以在不使用IDL的情况下描述COM接口。但是您将无法使用类型库和编组代码生成等IDL功能。但是,如果您只使用COM组件作为进程内服务器(DLL),并且可以将.h文件分发给客户端 - 那么这种方法可以正常工作。
避免在接口中使用C ++类型,因为在跨越DLL边界处理内存时可能会导致访问冲突。更好地使用普通C类型或COM类型