我开始开发 Windows 服务。我想使用我自己的一些类,它们对某些 MFC 类(如 CString、CSocket、CArchive、CMemFile 和 CObject)几乎没有依赖关系。MSDN说您需要非常小心您在 Windows 服务中使用哪些 MFC,但不要指定它,也不要描述可能出现的问题。
我的问题是:
- 可以使用哪些MFC?
- 使用 MFC 会出现什么问题?
- Windows 服务的哪些部分对 MFC 的使用至关重要?
- 是否建议对 Windows 服务使用 ATL 而不是 MFC?
我开始开发 Windows 服务。我想使用我自己的一些类,它们对某些 MFC 类(如 CString、CSocket、CArchive、CMemFile 和 CObject)几乎没有依赖关系。MSDN说您需要非常小心您在 Windows 服务中使用哪些 MFC,但不要指定它,也不要描述可能出现的问题。
我的问题是:
我不确定它们在 MSDN 文章中的含义。只要您不使用任何 GUI 功能就可以了 - 但这是开发服务时的一般设计问题。
话虽如此,ATL 具有专门为构建服务 IIRC 而设计的功能,因此您最好使用它。
回答您的问题(据我所知):
1)您指定的没有问题。
2) 我猜它们是指 UI 组件的同步问题。只要您不使用任何 CWnd 派生类就可以了。
3)不明白问题。
4) 见前,加上 ATL 更轻量级,因此您必须分发更少,并提供内置功能,这将使开发服务变得不那么痛苦。参见例如 CAtlServiceModuleT。您仍然可以主要使用自己的类,因为 CString 现在在 MFC 和 ATL 之间共享,而 ATL 具有用于套接字编程和内存文件映射本身的类。它没有 CArchive 的等价物,而且我不确定您在 CObject 中使用什么功能,所以我不能说 ATL 中是否有等价物。所以总而言之,我会对这个问题说“是”。
(我知道这个答案有点晚了,这个问题已经回答了,但服务中的 MFC 对我来说是一个痛处......)
据我所知,CSockets需要一个 Window。它在背景中制作了一个隐形的。当我尝试将一些预先存在的 MFC 代码包含到 Windows 服务中时,我发现了这一点。也许这只有在您接受套接字连接时才需要 - 我不记得了?但它没有用!(我究竟是如何在没有意识到这个限制的情况下浪费这么多时间做这件事的,这是一个很长的故事)
对象?如果您需要运行时类 id 的东西,请使用 RTTI(dynamic_cast 等...)
CString,我喜欢 CString,我知道它现在与 ATL 共享,不确定您是否将其拉入不带 MFC 或 ATL 的...您可以使用 std::string。另外,我记得有人创建了一个派生的 std::string,它提供了与 CString 相同的方法。(编辑:找到代码- 伙计!!这是过去的爆炸......)
CArchive、CMemFile:你真的需要这些吗?
无论如何,正如 Roel 所说,ATL 可能更有帮助。我不会在服务器端应用程序(永远!)ATL 中使用 MFC?也许。如果我需要 COM,我会挑衅。没有 COM,但对于 CAtlServiceModuleT 等......也许......
我刚刚在尝试将常规 MFC-ATL 应用程序转变为服务时遇到的关于服务中 MFC 的另一件坏事:如果没有 Window 过程,使用 AfxConnectionAdvise() 实际上是无用的。我服务中的线程只是常规的非消息泵线程。我相信这就是为什么我从来没有从我开发的另一个 COM 服务器触发事件的原因。另一个 COM 服务器挂在 Fire_xxxEvent() 上,导致整个系统大乱。