Pregunta

Estoy pensando en hacer mi aplicación existente en una IDT servidor .

La aplicación está escrita en C ++ actualmente y aunque con el tiempo se portarlo a C # / Mono Quiero ser capaz de añadir la funcionalidad de IDT con C ++.

He encontrado algunas piezas de la muestra de código (el MSVCRTDServer) y este sitio web: http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

Por desgracia, estos son archivos DLL y me han olvidado todo lo que sabía de COM (en buena hora) hace mucho tiempo.

¿Cómo hago para la incorporación de los ejemplos DLL en el EXE? Esto es al parecer sobre el empaquetado del servidor COM en un archivo EXE en lugar de una DLL.

EDIT:

Tenga en cuenta, la aplicación cuenta con una interfaz gráfica de usuario existente MFC.

EDIT:

El uso previsto es taht la aplicación GUI existente va a correr - no es necesario para los clientes de la interfaz / RTD COM para lanzar la aplicación. (Aunque no voy a negar que sería bueno)

Básicamente quiero implementar la interfaz IRTDServer con mi propia de datos - por lo que Excel (u otras aplicaciones) pueden acceder a los datos dinámicos que ofrece la aplicación. (Es un programa que se comunica con un dispositivo de puerto serie - que el dispositivo tiene la condición / estado que los cambios y quiero ser capaz de actualizar los clientes sobre los cambios de forma asíncrona)

Por lo tanto, tengo que crear un objeto COM y registrarlo para que los clientes pueden "ver" la misma.

No estoy seguro de cómo agregar un objeto COM a un exe y tienen que poner en práctica un objeto COM pre-definfed interfaz existente /.

EDITAR Empecé una recompensa por esto por lo que podría conseguir muestras de código. Al parecer, yo soy demasiado perezoso y estúpido (o tal vez es sólo la aversión al hiper COM) para empezar con respuesta existente por Franci Penov. (Lo cual es muy útil y un gran comienzo)

Así que básicamente lo que estoy buscando es:

código para llevar a mi aplicación MFC basada diálogo existente que tiene un montón de hilos de ejecución y convertirlo en un servidor RTD (que tiene la misma interfaz de usuario)

Todo lo que CoCreate y CoThisandthat, etc. ¿Dónde pongo ese código en mi exe? ¿Cómo se amplía / poner en práctica las cosas IRTD?

A antes y después de un MFC muestra hola App World (diálogo basado) se va a conseguir la respuesta aceptada.

  1. Antes aplicación con todo el código fuente para la aplicación de diálogo MFC.
  2. "después" de la aplicación que se basa en la aplicación MFC en el paso # 1 que implementa la interfaz srver RTD y la totalidad de su fuente. (Todos los archivos de proyecto, fuente, etc.)
  3. medidas adoptadas en el GUI estudio / visual y de otra manera para crear el paso 2 de la etapa 1. (IDL, etc otros archivos creados.)

Lo ideal sería que así se contempla VS2008, pero cualquier versión funcionaría.

Gracias.

¿Fue útil?

Solución

EDIT: Amigo, no he tocado MFC desde el año 2000. Tenía la esperanza de permanecer así durante el resto de mi vida. :-) En fin ...

Aparentemente, los asistentes han evolucionado desde el siglo pasado. Los siguientes pasos para añadir soporte COM ATL y MFC de aplicación son para VS 2008.

  1. Generar una aplicación basada en cuadros de diálogo MFC simple llamado MFCTest. No marca la casilla de automatización en el asistente.
  2. Haga clic derecho sobre el proyecto y seleccione Agregar / Clase ... En el cuadro de diálogo, elija Objeto simple ATL. Usted recibirá un aviso de que el apoyo ATL se agrega al proyecto.
  3. Un nuevo asistente se abrirá con opciones para el nuevo objeto ATL.

Se debe hacer.

Francamente, no veo ninguna razón para publicar aquí un código generado por el asistente. Pero si usted tiene más preguntas sobre determinadas piezas de ese código, los publicará en SO y yo te ayudaré.


EDIT: Esto se está convirtiendo poco a poco en un artículo. Si seguimos así, que incluso podría publicar un libro. : -)

Una vez que tenga el objeto ATL sencilla integrada en el proyecto MFC, se puede añadir la interfaz RTD a ella. Será necesario que tanto heredan de la interfaz y agregarlo a la COM_INTERFACE_MAP. Desde la interfaz RTD es una interfaz IDispatch, usted tiene que heredar la clase de IDispatchImpl <> y agregue IDispatch a la COM_INTERFACE_MAP usando COM_INTERFACE_ENTRY2 (con el fin de especificar que se implementa a través de la IRtdServer.

No estoy muy familiarizado con el funcionamiento de IDT. También podría tener que añadir soporte para puntos de conexión COM a su clase, si necesita Excel para supscribe a sus actualizaciones. Aquí hay también un enlace para refrescar la puntos de conexión en Atlanta conocimiento.

Por cierto, me encontré con este blog que tiene el C ++ de los dos RTD Interfaces . Es probable que ya los tiene, pero lo que me gustaría añadir que por el bien completo.


La forma más fácil sería crear nuevo proyecto ATL EXE a través del asistente VS y dejar que tome el registro y la parte de la gestión de procesos. El resto no es tan diferente.

Si necesita una muestra particular para poner en marcha su viaje de regreso a la tierra de COM fuera de proc, se puede ver en Labrador .

Un par de enlaces que pueden ser de más interés para usted:

EDIT: Si sólo tiene que saber cómo registrar un objeto en el archivo EXE con el COM, por lo que las aplicaciones cliente pueden CoCreateInstance ella, echa un vistazo a CoRegisterClassObject . Sin embargo:

  • el objeto debe ser un objeto COM
  • es necesario implementar un generador de clases para ello
  • si desea que la gestión de procesos (es decir, COM inicia su aplicación a la vista), el ClassID nees para ser inscrito en el registro
  • si el cliente va a crear a través de identificador de programa, la necesidad ProgIDs para ser inscrito en el registro
  • que pueda necesitar un DLL proxy personalizado / ramal, si se está haciendo costumbre cálculo de referencias
  • Si su aplicación tiene la interfaz de usuario, tendrá que modificar la lógica de cierre, de modo que cuando el usuario cierra la interfaz de usuario, la aplicación no sale untili la última referencia COM a los objetos ha sido puesto en libertad, así

EDIT 2: Todavía te sugeriría que nos fijamos en la muestra de ATL fuera de proc y el esqueleto del asistente ATL generaría para entender la secuencia de operaciones. Sin embargo, puede que tenga que ahondar un poco en el código ATL para ver lo que está pasando exactamente.

Aquí está la versión corta del proceso:

En un inicio, los nees aplicación para comprobar si hay un argumento de línea de comando en particular - / incrustado . Si ese argumento está presente, significa que la aplicación está siendo lanzada por la COM en respuesta a una llamada Coco. La aplicación puede optar por no mostrar su interfaz de usuario en este punto.

Si la aplicación muestra la interfaz de usuario o no, tiene que registrar las fábricas de clase de objetos de cualquier COM proporciona a través de la API CoRegisterClassObject he mencionado anteriormente.

Si la aplicación se inicia a través de COM, se puede optar por el apagado él mismo sobre la liberación última referencia de COM. (Esto normalmente se detecta a través de un contador de ref mundial adicional que se incrementa en cualquier AddRef objeto y disminuyó en cualquier objeto Release). Sin embargo, la aplicación no debe apagado él mismo, si se detecta que el usuario ha interactuado con su interfaz de usuario. en tal caso, el cierre se difiere hasta que el usuario cierra explícitamente la última interfaz de usuario (Para hacer más fácil que la detección, la aplicación por lo general no es suficiente para demostrar su interfaz de usuario hasta que el usuario intenta iniciar explícitamente)

Si la aplicación se inició por el usuario y la interfaz de usuario las está cerrado, la aplicación debe comprobar si hay referencias COM sobresalientes a cualquier objeto en ella. Si no los hay, se puede apagar en sí. Sin embargo, si hay referencias COM, la aplicación debe ocultar la interfaz de usuario, pero continuará funcionando hasta que se libera la última referencia.

Si la aplicación ha llegado a un punto en el que será apagado, se debe revocar todos los registros de clases.

Otros consejos

Marshal su código en un proyecto de servidor ATL. Ver muestras en muestras ATL Server .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top