【问题标题】:Using MFC in Windows service?在 Windows 服务中使用 MFC?
【发布时间】:2010-11-12 22:18:43
【问题描述】:

我开始开发 Windows 服务。我想使用我自己的一些类,它们对某些 MFC 类(如 CString、CSocket、CArchive、CMemFile 和 CObject)几乎没有依赖关系。 MSDN 说你需要非常小心你在 Windows 服务中使用了哪些 MFC,但不要指定它,也不要描述可能出现的问题。

我的问题是:

  • 可以使用哪些 MFC?
  • 使用 MFC 会出现什么问题?
  • Windows 服务的哪些部分对 MFC 的使用至关重要?
  • 对于 Windows 服务是否建议使用 ATL 而不是 MFC?

【问题讨论】:

    标签: visual-studio visual-c++ mfc atl mfc-networking


    【解决方案1】:

    我不确定它们在 MSDN 文章中的含义。只要您不使用任何 GUI 功能就可以了 - 但这是开发服务时的一般设计问题。

    话虽如此,ATL 具有专门为构建服务 IIRC 而设计的功能,因此您最好使用它。

    回答您的问题(据我所知):

    1) 你指定的没问题。

    2) 我猜它们是指 UI 组件的同步问题。只要你不使用任何 CWnd 派生类就可以了。

    3) 不懂问题。

    4) 见前文,加上 ATL 更轻量级,因此您必须分发更少,并提供内置功能,使开发服务变得不那么痛苦。参见例如CAtlServiceModuleT.您仍然可以主要使用自己的类,因为 CString 现在在 MFC 和 ATL 之间共享,而 ATL 具有用于套接字编程和内存文件映射本身的类。它没有 CArchive 的等价物,而且我不确定您在 CObject 中使用什么功能,所以我不能说 ATL 中是否有等价物。总而言之,我会对这个问题说“是”。

    【讨论】:

      【解决方案2】:

      (我知道这个答案有点晚了,这个问题已经回答了,但是服务中的 MFC 对我来说是一个痛处......)

      据我所知,CSockets需要一个窗口。它在背景中制作了一个隐形的。当我尝试将一些预先存在的 MFC 代码包含到 Windows 服务中时,我发现了这一点。也许这只有在您接受套接字连接时才需要 - 我不记得了? 但它没有用!(我究竟是如何浪费了这么多时间来做这件事而没有意识到这个限制是一个漫长的故事)

      C 对象?如果您需要运行时类 id 的东西,请使用 RTTI(dynamic_cast 等)

      CString,我喜欢 CString,我知道它现在与 ATL 共享,不确定您是否将其拉入不带 MFC 或 ATL 的...您可以使用 std::string。另外,我记得有人创建了一个派生的 std::string,它提供了与 CString 相同的方法。 (编辑:找到code - 伙计!!这是过去的爆炸......)

      CArchive、CMemFile:你真的需要这些吗?

      无论如何,正如 Roel 所说,ATL 可能更有帮助。我不会在服务器端应用程序(永远!)ATL 中使用 MFC?可能是。如果我需要 COM,我会挑衅。没有 COM,但对于 CAtlServiceModuleT 等......也许......

      【讨论】:

      • 感谢分享您的经验!
      • 我发现下载链接对于 CString 替换不起作用,但在 CodeProject codeproject.com/KB/string/stdstring.aspx 上找到了相同的东西(我认为)
      • 感谢 GH!您的链接也是我所指的同一类(“Stud”字符串)! - 我会更新我的答案中的链接。我知道这是同一个项目,因为我记得来源中的这条评论:“如果它导致您价值 300 亿美元的卫星在轨道上爆炸,请不要怪我。”
      【解决方案3】:

      我刚刚在尝试将常规 MFC-ATL 应用程序转变为服务时遇到的关于服务中 MFC 的另一件坏事:如果没有 Window 过程,使用 AfxConnectionAdvise() 实际上是无用的。我服务中的线程只是常规的非消息泵线程。我相信这就是为什么我从来没有从我开发的另一个 COM 服务器触发事件​​的原因。其他 COM 服务器挂在 Fire_xxxEvent() 上,导致整个系统大乱。

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 2014-06-24
        • 2020-06-10
        相关资源
        最近更新 更多