在Windows服务中使用MFC?

时间:2009-07-22 08:43:17

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

我开始开发Windows服务。我想使用我自己的一些类,它们对CString,CSocket,CArchive,CMemFile和CObject等一些MFC类几乎没有依赖性。 MSDN表示您需要非常小心在Windows服务中使用哪些MFC,但不要指定它,也不要描述可能出现的问题。

我的问题是:

  • 可以使用哪些MFC?
  • 使用MFC可以期待什么问题?
  • Windows服务的哪些部分对MFC的使用至关重要?
  • 建议使用ATL代替MFC进行Windows服务吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

1)你指定的那些没问题。

2)我猜他们意味着UI组件的同步问题。只要你不使用任何CWnd派生类,你就可以了。

3)不明白这个问题。

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

答案 1 :(得分:3)

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

CSockets,我记得, 需要一个窗口 。它在后台制作一个看不见的。当我尝试将一些预先存在的MFC代码包含到Windows服务中时,我发现了这种方法。也许只有你接受套接字连接才需要这个 - 我不记得了? 但它不起作用!(我是多么浪费这么多时间来实现这个限制是一个漫长的故事)

CObject的?如果您需要运行时类ID,请使用RTTI(dynamic_cast等等)

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

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

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

答案 2 :(得分:0)

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