2009-07-22 27 views
5

我開始開發Windows服務。我想使用我自己的一些類,它對CString,CSocket,CArchive,CMemFile和CObject等MFC類沒有依賴關係。 MSDN表示您需要非常小心您在Windows服務中使用哪些MFC,但未指定它並且不描述可能發生的問題。在Windows服務中使用MFC?

我的問題是:

  • 可以用哪件MFC的?
  • 通過使用MFC,我可以期待什麼問題?
  • Windows服務的哪些部分對MFC的使用至關重要?
  • 建議使用ATL而不是MFC for Windows服務?

回答

4

我不確定他們在MSDN文章中的含義。只要你不使用任何GUI功能,你就會很好 - 但在開發服務時這是一個普遍的設計問題。這就是說,ATL具有專門爲建立服務IIRC而設計的功能,所以你可能會更好地使用它。

回答您的問題(據我所知):

1)你指定的人都沒有問題。

2)我想他們意味着與UI組件的同步問題。只要你不使用任何CWnd派生類,你會沒事的。

3)不明白這個問題。

4)請參閱前面的內容,再加上ATL更輕量級,所以您必須分配更少的內存,並提供內置功能,這將使開發服務更輕鬆。見例如CAtlServiceModuleT。你仍然可以主要使用自己的類,因爲CString現在在MFC和ATL之間共享,而ATL有套接字編程和內存文件映射本身的類。它沒有CArchive的等價物,我不確定你在CObject中使用了哪些功能,所以我不能說ATL中是否有相應的功能。所以總結一下,我會對這個問題說'是'。

3

(我知道這個答案是有點晚,這個問題已經回答了,但MFC的服務是一個痛處我...)

CSockets,據我記得,需要一個窗口。它在後臺製作了一個看不見的東西。當我嘗試在Windows服務中包含一些預先存在的MFC代碼時,我發現這是很難的方法。也許這隻有在你接受套接字連接時才需要 - 我不記得了嗎? 但它沒有奏效!(我究竟浪費了太多的時間來做這件事,而沒有意識到這個限制是一個很長的故事)

CObject?如果你需要運行時間類ID的東西使用RTTI(dynamic_cast,等...)

CString,我喜歡CString,我知道它現在與ATL共享, ...你可以使用std :: string。另外,我記得有人創建了一個派生的std :: string,它提供了與CString相同的方法。 (編輯:找到code - 男人!!這是一個從過去的爆炸...)

CArchive,CMemFile:你真的需要這些嗎?無論如何,正如Roel所說,ATL可能更有幫助。我不會在服務器端應用程序中使用MFC(永遠!)ATL?也許。如果我需要COM,挑釁。沒有COM但是對於CAtlServiceModuleT等...也許......

+0

感謝您分享您的體驗! – mem64k 2009-08-20 06:40:28

0

另一個關於MFC在我嘗試將常規MFC-ATL應用程序變成服務時遇到的服務中的壞事:使用AfxConnectionAdvise ()在沒有Window過程的情況下實際上是無用的。我服務中的線程只是普通的非消息抽取線程。我相信這就是爲什麼我從來沒有從我開發的另一個COM服務器發起事件。其他COM服務器掛在Fire_xxxEvent()上,導致整個系統混亂不堪。