2

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

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

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

但是非 Windows 8 系统呢?

4

2 回答 2

8

好吧,当然可以。您可以用纯 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++ 时,根本没有,尽管您必须自己编写太多。

于 2014-06-12T11:22:08.547 回答
0

是的。您可以编写一个标准的 COM 组件。文档中直接有一个示例

不可以:这样的 COM 组件只能在 Windows 8 及更高版本上运行......

于 2014-06-12T10:19:35.833 回答