代码之家  ›  专栏  ›  技术社区  ›  mem64k

在Windows服务中使用MFC?

  •  5
  • mem64k  · 技术社区  · 15 年前

    我开始开发Windows服务。我想使用我自己的一些类,它们与一些MFC类(如cstring、csocket、carchive、cmemfile和cobject)几乎没有依赖关系。 MSDN 说您需要非常小心在Windows服务中使用哪些MFC,但不要指定它,也不要描述可能发生的问题。

    我的问题是:

    • 可以使用哪些MFC?
    • 使用MFC,我可以预料到什么问题?
    • Windows服务的哪些部分对MFC的使用至关重要?
    • 对于Windows服务,建议使用ATL而不是MFC吗?
    3 回复  |  直到 15 年前
        1
  •  4
  •   Roel    15 年前

    我不知道它们在msdn的文章中是什么意思。只要您不使用任何GUI功能,您就可以了——但在开发服务时,这是一个一般的设计问题。

    也就是说,ATL有专门为建筑服务IIRC设计的功能,所以您最好使用它。

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

    1)您指定的那些没有问题。

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

    3)不理解问题。

    4)请参阅之前的内容,另外ATL更轻,因此您必须减少分发,并提供内置功能,以减少开发服务的痛苦。请参见例如catlserviceModulet。您仍然可以主要使用自己的类,因为CString现在在MFC和ATL之间共享,并且ATL有用于套接字编程和内存文件映射本身的类。它没有与carchive等效的功能,我不确定您在cobject中使用的功能,所以我不能说atl中是否有等效的功能。所以最后,我会对这个问题说“是”。

        2
  •  3
  •   Aardvark    15 年前

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

    cSockets,据我所知, 需要一个窗口 . 它使背景中的一个不可见。当我尝试在Windows服务中包含一些预先存在的MFC代码时,我发现了这一点。也许只有接受了插座连接才需要这样做-我想不起来了? 但它不起作用! (我到底是如何浪费这么多时间来实现这一限制的,这是一个很长的故事)

    CObject?如果您需要运行时类ID的东西,请使用rtti(动态\u cast等…)

    CString,我喜欢CString,我知道它现在已经和ATL共享了,不确定您是在不包括MFC还是ATL的情况下拉它…您可以使用std::string。另外,我记得有人创建了一个派生的std::string,它提供了与cstring相同的方法。 (编辑:找到 code -伙计!!这是过去的爆炸…)

    卡奇夫:你真的需要这些吗?

    不管怎样,正如罗尔所说,ATL可能更有用。我不会在服务器端应用程序中使用MFC(永远!)ATL?也许吧。如果我需要通信,就要挑衅。没有COM,只有catlserviceModulet等…也许吧。。。。

        3
  •  0
  •   kellogs    15 年前

    还有一件关于服务中的MFC的坏事情,我在尝试将常规的MFC-ATL应用程序转换为服务时遇到过:如果没有窗口过程,使用afxConnectionAdvise()实际上是无用的。我服务的线程只是普通的非消息泵线程。我相信这就是为什么我从未从我开发的另一个COM服务器上触发事件的原因。另一个COM服务器挂起fire_xxxevent(),导致整个系统混乱。