2009-07-22 7 views
5

Windows 서비스를 개발하기 시작했습니다. 내 자신의 일부 클래스를 사용하려면 CString, CSocket, CArchive, CMemFile 및 CObject 같은 일부 MFC 클래스에 약간의 종속성이 있습니다. MSDN은 Windows 서비스에서 사용하는 MFC 조각에 대해주의를 기울일 필요가 있지만이를 지정하지 않고 발생할 수있는 문제에 대해 설명하지 않는다고 말합니다.Windows 서비스에서 MFC 사용 하시겠습니까?

내 질문은 :

  • 사용할 수 있습니다 MFC의 어떤 부분?
  • MFC를 사용하면 어떤 문제가 발생할 수 있습니까?
  • Windows 서비스의 어떤 부분이 MFC 사용에 중요합니까?
  • Windows 서비스의 경우 MFC 대신 ATL을 사용하는 것이 좋습니다?

답변

4

MSDN 문서에서 무엇이 의미하는지 모르겠습니다. GUI 기능을 사용하지 않는다면 서비스를 개발할 때 일반적인 디자인 문제가 될 수 있습니다.

즉, ATL에는 IIRC 서비스를 위해 특별히 설계된 기능이 있으므로 사용하는 것이 더 나을 수 있습니다. 사용자가 지정하는 사람은 아무 문제 없습니다

1) :

는 (본인이 아는) 귀하의 질문에 대답합니다.

2) UI 구성 요소와의 동기화 문제를 의미한다고 생각합니다. CWnd 파생 클래스를 사용하지 않는 한 괜찮을 것입니다.

3) 질문을 이해하지 못합니다.

4) 앞서 살펴본 바와 같이 ATL은 더 가벼워서 적은 양으로 배포해야하며 서비스를 개발하는 데 어려움을 덜 줄 수있는 빌드 인 기능을 제공합니다. 예 : CAtlServiceModuleT. 현재 CString은 MFC와 ATL간에 공유되므로 ATL은 소켓 프로그래밍과 메모리 파일 매핑 자체에 대한 클래스를 가지고 있기 때문에 대부분 자신의 클래스를 사용할 수 있습니다. 그것은 CArchive에 대한 동등한을 가지고 있지 않으며, 내가 CObject에서 어떤 기능을 사용하는지 모르겠다. 그래서 ATL에 동등한 것이 있는지 말할 수 없다. 결론적으로이 질문에 '예'라고 대답 할 것입니다.

3

내 기억까지로,

CSockets을 (... 나는이 대답은 조금 늦게 알고이 질문에 이미 답했지만 서비스 MFC 나에게 아픈 곳입니다), 는 창을 필요로. 그것은 백그라운드에서 보이지 않는 것을 만듭니다. 내가 시도한이 어려운 방법은 Windows 서비스에 일부 기존 MFC 코드를 포함하는 것으로 나타났습니다. 어쩌면 이것은 소켓 연결을 허용 한 경우에만 필요합니다 - 기억하지 못합니까? 하지만 작동하지 않았습니다! (이 제한을 실현하는 데 얼마나 많은 시간을 낭비했는지는 긴 이야기입니다)

CObject? 런타임 클래스 ID stuff 사용 RTTI (dynamic_cast, 등 ...)

CString을 좋아해요, CString을 좋아합니다. ... std :: string을 사용할 수 있습니다. 또한 누군가 CString과 동일한 메서드를 제공하는 파생 된 std :: string을 만들었습니다. (편집 : code - 사람을 발견했습니다! 과거로부터의 폭발입니다 ...)

CArchive, CMemFile : 정말 필요합니까?

어쨌든 Roel이 말했듯이 ATL이 더 도움이 될 수 있습니다. MFC는 서버 측 응용 프로그램에서 사용하지 않을 것입니다 (ATL). 아마도. COM을 필요로한다면, 도전적으로 COM은 없지만 CAtlServiceModuleT 등 ... 어쩌면 ....

+0

경험을 공유해 주셔서 감사합니다. – mem64k

+1

다운로드 링크가 CString 대체에 작동하지 않았지만 CodeProject http://www.codeproject.com/KB/string/stdstring.aspx에서 같은 것을 발견했습니다. –

+0

감사합니다. GH! 너의 연결은 나가 또한 참조하고 있던 동일한 종류 ("장식 못"끈)이다! - 대답에서 링크를 업데이트 할 것입니다. 나는 이것이 소스에서이 주석을 기억하고 있기 때문에 이것이 같은 프로젝트라는 것을 알고있다. "300 억 달러 규모의 인공위성이 궤도에서 폭발 할 경우 저를 비난하지 마십시오." – Aardvark

0

정규 MFC-ATL 앱을 서비스로 전환하는 동안 막 경험 한 서비스의 또 다른 나쁜 점은 다음과 같습니다. AfxConnectionAdvise()는 Window 프로 시저가 없으면 실제로 쓸모가 없다. 내 서비스의 스레드는 단지 일반적인 비 메시지 펌핑 스레드입니다. 이것이 제가 개발 한 다른 COM 서버에서 이벤트를 발생시키지 않는 이유입니다. 그 다른 COM 서버가 Fire_xxxEvent()에 멈추어 전체 시스템에서 큰 혼란을 야기합니다.

관련 문제