PDA

Ver la Versión Completa : Ceder Hinstance de la aplicación


escafandra
12-01-2008, 18:59:04
Para una aplicación necesito tener abierta solo una instancia. Pero si intento abrir otra, lo que debe hacer es pasar los parámetros de esta última a la primera y si es posible cederle su Hinstance, para luego, cerrarse. De forma que para todos los efectos solo existe una Hinstance que aunque pertececía a la segunda abierta, ahora apunta a la primera.


Saludos.

cHackAll
14-01-2008, 20:18:14
Deberas hacer una busqueda en el foro pues el caso ya se ha visto; pero como adelanto de doy las ideas;

1. Puedes buscar la aplicación con FindWindow; si la encuentras significa que tu aplicación ya esta corriendo; entonces le pasas los parametros por SendMessage.

2. Puedes crear un File-Mapping con CreateFileMapping con un lpName específico; al obtener un GetLastError = ERROR_ALREADY_EXISTS; sabrás que debes escribir en el archivo de intercambio los parámetros y cerrar la nueva instancia.

Como variacion del anterior pueses usar OpenFileMapping; si te retorna 0 significa tambien que ya existe; si no la puedes crear y sabes que eres "la primera instancia".

Saludos

escafandra
16-01-2008, 08:31:23
Yo utilizo la opcion 1. Pero con esto detecto que la aplicación está activa y la accion siguente sería pasar parámetros y cerrar la nueva instancia.

La idea es que esa nueva instancia, que se cierra, pase a la primera, es decir que el valor de la antigua sea el de la nueva. De esta forma, a todos los efectos (para Windows y todos los programas activos), es la nueva la que existe aunque en realidad sea la antigua.

Gracias y Saludos.

cHackAll
16-01-2008, 21:55:31
Ok; utilizas FindWindow y con ello obtienes el handle de la ventana de la primera instancia... a ese handle le envias un mensaje (WM_USER+6) y en wParam y lParam envias los nuevos parámetros que pueden ser punteros... y cierras; la primera instancia recive los nuevos parámetros y listo.

Saludos

escafandra
17-01-2008, 01:03:52
Ok; utilizas FindWindow y con ello obtienes el handle de la ventana de la primera instancia... a ese handle le envias un mensaje (WM_USER+6) y en wParam y lParam envias los nuevos parámetros que pueden ser punteros... y cierras; la primera instancia recive los nuevos parámetros y listo.

Saludos

Justo eso mismo hago, sólo que si envío punteros y cierro la 2ª instancia (la nueva), estos se pierden antes de recibir el mensaje, por lo que hay que esperar a estar seguros de que se reciben y después cerrar.

De todas formas la idea es que la instancia vieja se convierta en la nueva al finalizar el proceso (valor HINSTANCE hInstance).

Me explico: otro programa es el que llama al mio y debe esperar a que termine la ejecución y se cierre. Si previamente estaba abierto, debe parecer que es la instancia que el programa abrió, le pasa los parámetros y entre ellos uno que indique que se cierre al terminar. Este es el motivo de que pretenda cambiar el valor de HINSTANCE hInstance.

Lo que no se es si esto está permitido o es de uso exclusivo del S.O.

Otra posibilidad sería que se cerrase la instancia vieja, pero esto provocaría la perdida de datos y el trabajo que estuviera realizando.

Saludos.