我开始开发Windows服务了。我想使用我自己的一些类,这些类对一些MFC类几乎没有依赖,比如CString、CSocket、CArchive、CMemFile和CObject。MSDN说,您需要非常小心在Windows中使用哪些MFC,但不要指定它,也不要描述可能发生的问题。
我的问题是:
发布于 2009-07-22 14:54:23
我不知道它们在MSDN文章中的意思。只要您不使用任何GUI功能,就可以了--但是在开发服务时,这是一个普遍的设计问题。
话虽如此,ATL有专门为构建服务IIRC而设计的功能,所以您最好使用该功能。
回答你们的问题(据我所知):
( 1)你指定的那些没有问题。
2)我猜它们是指UI组件的同步问题。只要您不使用任何CWnd派生类,就可以了。
3)不理解问题。
4)前面看到的,加上ATL更轻量级,所以您必须发布更少的版本,并提供内置功能,从而减少开发服务的难度。参见例如CAtlServiceModuleT。您仍然可以使用您自己的类,因为CString现在在MFC和ATL之间共享,ATL有用于套接字编程和内存文件映射本身的类。它没有与CArchive相当的功能,我也不知道您在CObject中使用了什么功能,所以我不能说ATL中是否有类似的功能。最后,我会对这个问题说“是”。
发布于 2009-08-19 19:36:49
(我知道这个答案有点晚了,这个问题已经回答了,但MFC在服务领域对我来说是个痛处。)
CSockets,据我所知,需要一个窗口。它使一个看不见的在背景中。当我尝试将一些预先存在的MFC代码包含到一个windows服务中时,我发现了这一点。也许只有当您接受套接字连接时才需要这样做--我想不起来了?,但是它没有工作!(我怎么浪费了这么多时间来做这个w/o,意识到这个限制是一个很长的故事)
CObject?如果您需要运行时类id,请使用RTTI (dynamic_cast等)
CString,我喜欢CString,我知道它现在已经和ATL共享了,不确定你是否在w/o MFC或ATL中加入了.您可以使用std::string。此外,我还记得有人创建了一个派生的std::string,它提供了与CString相同的方法。(编辑:找到代码 - man!那是过去的爆炸.)
CArchive,CMemFile:你真的需要这些吗?
不管怎样,正如Roel所说的,ATL可能更有帮助。我不会在服务器端应用程序中使用MFC (永远不会!)阿塔尔?也许吧。如果我需要COM,那就直截了当。除了CAtlServiceModuleT等..。也许..。
发布于 2010-03-02 19:31:00
还有一个关于MFC在服务中的坏处,我刚刚在尝试将一个常规的MFC应用程序转换为一个服务时就遇到了这个问题:如果没有窗口过程,使用AfxConnectionAdvise()实际上是无用的。我服务中的线程只是普通的非消息泵线程。我相信这就是为什么我从来没有从我开发的另一个COM服务器中触发事件。另一个COM服务器挂在Fire_xxxEvent()上,给整个系统造成很大的混乱。
https://stackoverflow.com/questions/1163905
复制相似问题