2009-07-22 7 views
5

Estoy empezando a desarrollar un servicio de Windows. Quiero utilizar algunas clases propias, que tienen pequeñas dependencias con algunas clases de MFC como CString, CSocket, CArchive, CMemFile y CObject. MSDN dice que debe tener mucho cuidado con las piezas de MFC que usa en el servicio de Windows, pero no las especifica y no describe los problemas que pueden ocurrir.¿Cómo usar MFC en el servicio de Windows?

Mis preguntas son:

  • qué piezas de MFC se pueden utilizar?
  • ¿qué problemas puedo esperar al usar MFC?
  • ¿qué partes del servicio de Windows son críticas para el uso de MFC?
  • ¿es aconsejable utilizar ATL en lugar de MFC para el servicio de Windows?

Respuesta

4

No estoy seguro de lo que significan en el artículo de MSDN. Siempre y cuando no uses ninguna de las funciones de la GUI, estarás bien, pero eso es un problema de diseño general al desarrollar servicios.

Dicho esto, ATL tiene una funcionalidad específicamente diseñada para la construcción de servicios IIRC, por lo que es mejor que la uses.

para responder a sus preguntas (a lo mejor de mi conocimiento):

1) los especificados no son un problema.

2) Supongo que significan problemas de sincronización con los componentes de la interfaz de usuario. Siempre que no uses ninguna clase derivada de CWnd, estarás bien.

3) No entiendo la pregunta.

4) Consulte antes, además de que ATL es más liviano, por lo que tendrá que distribuir menos y ofrece una funcionalidad incorporada que le facilitará el desarrollo del servicio. Ver p. CAtlServiceModuleT. Aún podrá usar sus propias clases, ya que CString se comparte entre MFC y ATL hoy en día y ATL tiene clases para programación de socket y mapeo de archivos de memoria. No tiene un equivalente para CArchive, y no estoy seguro de qué funcionalidad usas en CObject, así que no puedo decir si hay un equivalente en ATL. Entonces para concluir, yo diría 'sí' a esta pregunta.

3

(ya sé que respuesta es un poco tarde y esta pregunta ya fue respondida pero MFC de servicios es un punto sensible para mí ...)

CSockets, lo que recuerdo, requieren una ventana. Hace un invisible en el fondo. Descubrí esto de la peor manera cuando intenté incluir algún código MFC preexistente en un servicio de Windows. Quizás esto solo era necesario si aceptabas la conexión de socket, ¿no lo recuerdo? ¡Pero no funcionó! (Cómo desperdicié tanto tiempo haciendo esto sin darme cuenta de esta limitación es una larga historia)

¿Objeto? Si necesita las cosas de Id. De clase de tiempo de ejecución, use RTTI (dynamic_cast, etc ...)

CString, me gusta CString, sé que ahora se comparte con ATL, no estoy seguro si lo incluye sin MFC o ATL incluidos ... Podrías usar std :: string. Además, recuerdo que alguien creó una cadena std :: derivada que proporcionaba los mismos métodos que CString. (EDIT: encontré el code - ¡hombre! Eso es una explosión del pasado ...)

CArchive, CMemFile: ¿realmente los necesita?

De todos modos, como dijo Roel, ATL puede ser más útil. No usaría MFC en una aplicación del lado del servidor (¿alguna vez?) ATL? Tal vez. Si necesitaba COM, desafiante. Sin COM pero para CAtlServiceModuleT, etc ... tal vez ....

+0

Gracias por compartir tu experiencia! – mem64k

+1

Descubrí que el enlace de descarga no funcionaba para el reemplazo de CString, pero encontré lo mismo (creo) en CodeProject http://www.codeproject.com/KB/string/stdstring.aspx –

+0

Gracias GH! Tu enlace es de la misma clase (cadena "Stud") ¡Yo también me refería! - Actualizaré el enlace en mi respuesta. Sé que este es el mismo proyecto porque recuerdo este comentario en la fuente: "No me culpen si hace que su satélite de $ 30 mil millones de dólares explote en órbita". – Aardvark

0

Y otra cosa mala sobre MFC en servicios que acabo de experimentar al intentar convertir una aplicación MFC-ATL normal en un servicio: El uso de AfxConnectionAdvise() es en realidad inútil sin un procedimiento de ventana. Los hilos en mi servicio son solo hilos regulares sin bombeo de mensajes. Creo que esta es la razón por la que nunca me envían eventos desde otro servidor COM que he desarrollado. Ese otro servidor COM se cuelga en Fire_xxxEvent(), causando un gran desastre en todo el sistema.

Cuestiones relacionadas