我正在考虑在具有有限C ++编译器的嵌入式(非Windows)系统中使用COM接口,我正在寻找使用简单C ++的开源COM实现,特别是很少或根本不使用模板和不使用异常(是的,我知道COM不使用异常,但实现可以在内部使用它们。)
此时我主要寻找所有核心COM类型的C ++定义,即IUnknown,IDispatch,VARIANT等,以及智能指针,BSTR等的一些辅助类。对实现QueryInterface和IDispatch的某种程度的支持可能是很好,但我也可以自己做。我想找一个ITypeInfo实现,DCOM的嵌入式实现会很有吸引力。
我知道我可以使用Visual Studio提供的Microsoft源代码,但我宁愿避免使用它,因为我需要提供大量定义的复杂性,而且我希望避免使用它时出现任何可能的法律问题在非Windows平台上。我也非常熟悉ATL,由于编译器的限制,我不能使用这种模板化程度很高的方法。我有很多COM和DCOM的经验,所以我可以自己编写所有的定义和辅助类,如果需要的话我甚至可以编写自己的DCOM系统。但是如果有的话,我宁愿使用现有的开源实现。你有什么建议吗?
答案 0 :(得分:2)
几年前,我正在考虑启动COM / DCOM的FOSS实现,但没有到达任何地方,主要是因为我认为开源社区中的任何人都不会感兴趣。 Software AG(称为EntireX DCOM)有专有的实现,我认为这对您不感兴趣。
对于开源项目,除了Samba和Wine实现以及Mozilla中的XPCOM之外,还有OpenCOM。他们已将代码发布在SourceForge。
答案 1 :(得分:1)
我所知道的最接近的开源实现是Mozilla的XPCOM(它与微软的COM不完全相同,但非常相似)。但是我不确定是否仍然可以独立构建它,因为instructions provided现在已经过时了。
答案 2 :(得分:1)
我建议查看Wine。源代码是用C语言编写的,而不是C ++,从而避免了完整C ++支持,C ++模板等的任何和所有问题.Wine还有许多(大多数?)标准接口的实现。
例如,LoadTypeLib(返回ITypeInfo实现)的源代码位于dlls/oleaut32/typelib.c:383。 ITypeInfo::AddressOfMember位于typelib.c:6742(在ITypeInfo_fnAddressOfMember中)。
(看起来COM在C中实现有点奇怪,但COM正是出于这个原因精确定义了二进制标准,因此COM组件可以用任何语言实现,而不会对消费语言施加限制...)