【发布时间】:2010-12-16 22:41:00
【问题描述】:
我有一些 MFC 代码(自定义 CWnd 控件和一些要公开的类),我需要将它们制作成带有接口的 activex / COM 对象。使用 MFC 支持制作 ATL 项目并以这种方式制作我的 ActiveX 或制作 MFC ActiveX 控件更容易吗?
在做一个 activeX 控件时,做双界面(就像微软的 ACDual 中解释的那样)好/坏/没有区别吗?
【问题讨论】:
我有一些 MFC 代码(自定义 CWnd 控件和一些要公开的类),我需要将它们制作成带有接口的 activex / COM 对象。使用 MFC 支持制作 ATL 项目并以这种方式制作我的 ActiveX 或制作 MFC ActiveX 控件更容易吗?
在做一个 activeX 控件时,做双界面(就像微软的 ACDual 中解释的那样)好/坏/没有区别吗?
【问题讨论】:
如果您是 COM 方面的新手,MFC 是一条更简单的途径:向导更好,更有帮助。但它远不如 ATL 灵活,如果您只需实现几个简单的接口,这可能不是问题。
另外,IIRC MFC 不支持双接口。双接口在两种情况下很有趣: - 性能是一个问题。例如调用一个短方法执行了数百万次。 - 对象用户是用 C++ 编程的。在 C++ 中调用原生接口比调用自动化接口要容易得多。
总之,双界面很酷,但只有当你可以免费拥有它们时,它们才真正有趣。这意味着您使用支持它们的框架。如果您计划进行大量基于 COM 的工作,那么研究 ATL 和更深入的 COM 知识会很有趣。如果您只需要提供几个简单的基于 MFC 的对象,那就坚持使用 MFC。
【讨论】:
将 MFC 用于 COM 有点痛苦——要编写的代码太多,要复制的宏—— 但是,如果混合使用 MFC 和 ATL,则必须知道自己在做什么,因为它们看似相似但又不同,尤其是在使用 ATL 创建窗口时。
主要的是,如果您从 ATL 使用 MFC,则需要使用 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 启动每个 ATL 方法,否则会出现随机问题。这在您使用 MFC 实现 COM 时会自动为您完成,这就是为什么每个方法中都有这些丑陋的 METHOD_MANAGE_STATE 宏。
除此之外,它只是工作。 ATL 对象中的 MFC 对象是我所做的..
【讨论】:
我一直使用没有 MFC 的直接 ATL 来开发 COM 组件。 MFC 作为应用程序框架很有用,我通常不需要轻量级(非 UI)COM 组件。 ATL 为字符串、集合和各种实用程序类提供了大量支持,而无需引入所有 MFC 以及由此产生的逻辑复杂性(例如在每个公共 API 调用上设置上下文等)。如果您正在构建 UI 组件,它还包括通过 CWindow 及其朋友提供的一些基本 UI 支持。
【讨论】: