PDA

Ver la Versión Completa : Abrir fichero en la aplicación que ya está corriendo


vejerf
25-05-2010, 16:45:24
Buenas a todos,
Creo que el título no es demasiado explicativo y tampoco sé si este es el sitio más apropiado del foro para hacer la pregunta.

Cuento un poco lo que intento hacer. Tengo mi aplicación desarrollada en Delphi que al iniciarse ejecuta otra aplicación externa (que no es más que una cartografía). Pues bien, esta aplicación externa hace uso de unos ficheros con extensiones propias .wpt, .rte y .rtk.

Yo quiero desde mi aplicación modificar estos ficheros y volver a cargarlos en la aplicación. Para ello he visto en el foro que se hace uso de la api shellexecute.

Pues bien mediante el código siguiente logro abrir el fichero, pero el problema es que me crea una nueva instancia de la aplicación externa y yo lo que quiero es que lo abra sobre la que ya estoy ejecutando.

La sentencia que uso es la siguiente:

ShellExecute(PHandle,'open',PChar(NombreFichero),nil,nil, SW_SHOW);


¿Alguna idea de como hacer para que se me abra en la instancia que está corriendo?

La cosa es que si lo vuelvo a abrir hay veces que lo hace en la que yo quiero y otras en la que ha abierto nueva y no me crea más instancias.

Faust
25-05-2010, 16:57:39
Con ShellExecute no puedes hacer eso, existe ShellExecuteEx dentro del API, pero sinceramente no sé como usarla ni como funciona.

Como opción checa si el programa que abre tus archivos tiene la opción de ejecutar una sola instancia.

Por el momento eso te puedo responder yo, esperemos a los demás compañeros.

Saludos

vejerf
25-05-2010, 18:02:24
Hola Faust,

Gracias por tu respuesta, así sé que al menos se entiende lo que pretendo.

Me dejas como posible opción la de limitar el número de instancias del programa. Quizás con esto los ficheros siempre se abran en la misma instancia. No sé como hacerlo, pero investigaré mientras espero alguna otra aportación.

Gracias!

vejerf
27-05-2010, 10:52:36
Hola de nuevo,

Escribo este post porque he observado algo más sobre el comportamiento de la aplicación externa que uso.

Resulta que si abro el fichero con shellexecute, pero no he "integrado" la aplicación en el panel con SetParent funciona bien y todos los ficheros se abren sobre esta aplicación.

Sin embargo si abro la aplicación, lo "integro" en un panel con SetParent y abro un fichero con ShellExecute, el fichero se abre sobre otra instancia de la aplicación. Si esta nueva instancia la vuelvo a "integrar" en el panel y se vuelve a abrir otro fichero, se abre otra nueva instancia y así sucesivamente.

¿Alguien sabe por qué puede ocurrir esto?

Yo lo que pretendo es que todos los ficheros se me abran sobre la misma instancia de la aplicación.

Faust
27-05-2010, 17:38:52
Hola de nuevo,

Escribo este post porque he observado algo más sobre el comportamiento de la aplicación externa que uso.

Resulta que si abro el fichero con shellexecute, pero no he "integrado" la aplicación en el panel con SetParent funciona bien y todos los ficheros se abren sobre esta aplicación.

Sin embargo si abro la aplicación, lo "integro" en un panel con SetParent y abro un fichero con ShellExecute, el fichero se abre sobre otra instancia de la aplicación. Si esta nueva instancia la vuelvo a "integrar" en el panel y se vuelve a abrir otro fichero, se abre otra nueva instancia y así sucesivamente.

¿Alguien sabe por qué puede ocurrir esto?

Yo lo que pretendo es que todos los ficheros se me abran sobre la misma instancia de la aplicación.

Eso si sale de mi conocimiento, esperemos a los camaradas del foro

escafandra
27-05-2010, 20:29:00
ShellExecute abre la aplicación correspondiente, es decir, crea una instancia nueva de la misma. Si no deseamos crear otra instancia, no sirve ShellExecute. En este caso deberás estudiar como abre archivos la aplicación en cuestión para realizarlo tu (si admite parámetros, método de comunicación, simular teclas rápidas...)

Si la aplicación admite parámetros de ejecución y estos permiten abrir el fichero, que es lo habitual, un truco puede ser usar CreateProcess (http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx) para abrir la aplicación pesándole el parámetro adecuado para luego integrar su ventana en tu panel. Cada vez que quieras cargar un archivo nuevo, cierras la aplicación y repites el proceso. En esto también podrías usar ShellExecute pero te da menos control sobre el proceso creado. Este sistema puede servir si la aplicación no tarda mucho en abrir, en caso contrario debes investigar los modos ce comunicarte con ella.

Saludos.