我可以使用WRL编写COM服务器吗?

szx*_*szx 2 c++ com atl wrl

我可以在C++中使用WRL库来代替ATL来编写COM组件吗?如果是的话,我是否可以在较旧的桌面Windows系统上使用它,比如Windows XP?

我很确定第一个问题的答案是肯定的,因为我在MSDN上找到了这个教程:

http://msdn.microsoft.com/en-us/library/jj822931.aspx

但是非Windows 8系统呢?

Han*_*ant 6

嗯,当然可以.您可以在纯C++代码中编写COM服务器,而根本没有任何辅助类.如果你真的想要,你可以在C中写一个,尽管这违反了大多数司法管辖区的"日内瓦程序员权利公约".

可能不那么明显的是缺少的东西.WRL只是不会让编写服务器变得更容易.或者保持它.你错过了什么:

  • 没有任何帮助来实现IDispatch.在WinRT中已过时但在常规服务器中仍然非常重要.从脚本语言使用服务器的唯一方法是,IDispatch提供后期绑定支持.
  • 没有任何帮助进行注册.在WinRT中已过时,是常规服务器所必需的.请注意DllRegisterServer()入口点是如何丢失的.您通过要求手动编写注册表脚本来链接问题的页面.这是有效的,它不是您想要维护或记录的东西,因此IT人员可以做到正确.
  • 没有像BSTR,VARIANT和SAFEARRAY这样的自动化类型的包装器.在WinRT中与IDispatch一起被淘汰.但是你仍然可以回归<comutil.h>.
  • 对Visual Studio中内置的向导没有任何帮助,可以帮助您正确完成.COM服务器很笨拙,因为定义出现在代码的多个位置.并且需要完全匹配.您无法确保CalculatorComponent与IDL完全匹配,这完全取决于您.您从犯小错误中获得的编译器错误,特别是在维护错误时,可能会很痛苦.

还有一大堆如果不值得一提的小东西,比如公寓,ActiveX,聚合,错误信息等等.当你需要它时,伤害非常糟糕.WRL的一个可能的优点是神秘胶水较少,ATL有相当数量的胶水可以大大提高抽象水平.这是故意的,但必须要学习.当然,当你使用纯C++时根本就没有,尽管你必须自己写太多.