Proceso y parametros

15/09/2009 - 00:21 por Edilberto Arteaga | Informe spam
Hola a todos,
Tengo un ejecutable al que le paso un parametro, pero quiero que si mando a
llamar el mismo ejecutable la segunda vez con un parametro diferente no me
cree otra instancia, pero si que me cambie el valor del argumento.
por ejemplo si mando
miexe.exe valor1 y luego mando miexe.exe valor2 que no cree otra instancia
pero si que actualice el valor1 a valor2
hasta el momento se detectar si el exe ya esta en ejecucion pero no se como
cambiar el parametro
este es mi codigo

[STAThread]
static void Main(string[] args)
{
bool _unico;
string __valor = string.Empty;
if (args.Length>0)
__valor = args[0];

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Mutex app = new Mutex(false, "Balanzas2", out _unico);
if (_unico)
{
Application.Run(new Form1(__valor));
}
else
{
//aqui deberia de cambiar el valor del parametro
}

//Application.Run(new ListUnidades(__valor));
}

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
15/09/2009 - 09:16 | Informe spam
"Edilberto Arteaga" wrote in message
news:
Tengo un ejecutable al que le paso un parametro, pero quiero que si mando
a llamar el mismo ejecutable la segunda vez con un parametro diferente no
me cree otra instancia, pero si que me cambie el valor del argumento.
por ejemplo si mando
miexe.exe valor1 y luego mando miexe.exe valor2 que no cree otra
instancia pero si que actualice el valor1 a valor2
hasta el momento se detectar si el exe ya esta en ejecucion pero no se
como cambiar el parametro
este es mi codigo

[STAThread]
static void Main(string[] args)
{
bool _unico;
string __valor = string.Empty;
if (args.Length>0)
__valor = args[0];

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Mutex app = new Mutex(false, "Balanzas2", out _unico);
if (_unico)
{
Application.Run(new Form1(__valor));
}
else
{
//aqui deberia de cambiar el valor del parametro
}

//Application.Run(new ListUnidades(__valor));
}




Es más complicado de lo que parece. Ese código que tiene el "Main" se
está ejecutando en un proceso separado de la primera copia que ejecutaste.
El Mutex lo ven los dos procesos porque se mantiene dentro del sistema
operativo, pero el parámetro, que está en memoria del programa, se encuentra
completamente aislado y no puede uno de los procesos cambiar el valor en el
otro proceso.

Necesitas, por lo tanto, un mecanismo de comunicación inter-procesos
(por ejemplo, una canalización con nombre ("named pipe")). El primer
programa que arrancas tiene que iniciar un hilo que se quede a la escucha
para recibir notificaciones, mientras que el segundo proceso, en donde has
puesto lo de "aqui deberia de cambiar el valor del parametro", lo que tiene
que hacer es transmitir al primer proceso un mensaje con la orden de cambio
de parámetro incluyendo el nuevo valor que tiene que usar.
Respuesta Responder a este mensaje
#2 Miguel
16/09/2009 - 00:03 | Informe spam
On 14 sep, 19:21, "Edilberto Arteaga" wrote:
Hola a todos,
Tengo un ejecutable al que le paso un parametro, pero quiero que si mando a
llamar el mismo ejecutable la segunda vez con un parametro diferente no me
cree otra instancia, pero si que me cambie el valor del argumento.
por ejemplo si mando
miexe.exe valor1  y luego mando miexe.exe valor2 que no cree otra instancia
pero si que actualice el valor1 a valor2
 hasta el momento se detectar si el exe ya esta en ejecucion pero no se como
cambiar el parametro
este es mi codigo



Que tal si en lugar de un mutex, tu aplicación registra un window
message y lo broadcastea junto con el valor.

El form1 debería ser capaz de procesar el mensaje y devolver algún
resultado inteligible, digamos 4357.

Si la instancia recibe un 4357 se cierra. Sino, asume que es la única
instancia allí.
Respuesta Responder a este mensaje
#3 Alberto Poblacion
16/09/2009 - 08:56 | Informe spam
"Miguel" wrote in message
news:
On 14 sep, 19:21, "Edilberto Arteaga" wrote:
Que tal si en lugar de un mutex, tu aplicación registra un window
message y lo broadcastea junto con el valor.




Efectivamente, el mensaje sería un tipo de comunicación inter-procesos,
que vale para cumplir el requisito que yo comentaba en un mensaje anterior
de "se necesita algún mecanismo de comunicación inter-procesos".

Sin embargo hay que tener en cuenta una salvedad, que es un caso en que
este mecanismo no funcionaría como se espera:

En Windows Vista y Windows 7, hay un mecanismo de seguridad que impide la
comunicación entre programas con distinto nivel de privilegio (llamado
UIPI - User Interface Privilege Isolation). Esto significa que si arrancas
la aplicación haciendo doble-click sobre ella (con lo que el UAC te la
ejecuta con permisos de usuario normal), y luego vuelves a ejecutarla con
permisos de administrador (click-derecho, Ejecutar Como Administrador),
entonces te arrancaría una segunda copia porque los mensajes de windows no
circulan entre las dos versiones. Esto puede ser que te interese o que no te
interese (a lo mejor sí que quieres permitir dos copias de la aplicación si
se ejecutan con distintos permisos), pero es algo que hay que tener en
cuenta. En Windows XP este tipo de consideraciones no eran necesarias porque
no existía el UAC ni el UIPI.
Respuesta Responder a este mensaje
#4 Miguel
16/09/2009 - 14:40 | Informe spam
On 16 sep, 03:56, "Alberto Poblacion" <earthling-
wrote:
"Miguel" wrote in message

news:
On 14 sep, 19:21, "Edilberto Arteaga" wrote:

> Que tal si en lugar de un mutex, tu aplicación registra un window
> message y lo broadcastea junto con el valor.

   Efectivamente, el mensaje sería un tipo de comunicación inter-procesos,
que vale para cumplir el requisito que yo comentaba en un mensaje anterior
de "se necesita algún mecanismo de comunicación inter-procesos".

   Sin embargo hay que tener en cuenta una salvedad, que es un caso en que
este mecanismo no funcionaría como se espera:

   En Windows Vista y Windows 7, hay un mecanismo de seguridad que impide la
comunicación entre programas con distinto nivel de privilegio (llamado
UIPI - User Interface Privilege Isolation). Esto significa que si arrancas
la aplicación haciendo doble-click sobre ella (con lo que el UAC te la
ejecuta con permisos de usuario normal), y luego vuelves a ejecutarla con
permisos de administrador (click-derecho, Ejecutar Como Administrador),
entonces te arrancaría una segunda copia porque los mensajes de windows no
circulan entre las dos versiones. Esto puede ser que te interese o que no te
interese (a lo mejor sí que quieres permitir dos copias de la aplicación si
se ejecutan con distintos permisos), pero es algo que hay que tener en
cuenta. En Windows XP este tipo de consideraciones no eran necesarias porque
no existía el UAC ni el UIPI.



Sí, así es. Lo tenía presente de haberlo leído en la doc de SendMessage
(), y como dice en el remark, puede ser manejado por el programa:
GetLastError() == ERROR_ACCESS_DENIED.

Sí el broadcast no termina en un resultado inteligible se podría
testear si es debido a este error...
Respuesta Responder a este mensaje
#5 Edilberto Arteaga
17/09/2009 - 00:26 | Informe spam
gracias a los 2 por sus respuestas, voy a probar con sus sugerencias, luego
comento como los resultados.


"Miguel" escribió en el mensaje de
noticias:
On 16 sep, 03:56, "Alberto Poblacion" <earthling-
wrote:
"Miguel" wrote in message

news:
On 14 sep, 19:21, "Edilberto Arteaga" wrote:

> Que tal si en lugar de un mutex, tu aplicación registra un window
> message y lo broadcastea junto con el valor.

Efectivamente, el mensaje sería un tipo de comunicación
inter-procesos,
que vale para cumplir el requisito que yo comentaba en un mensaje
anterior
de "se necesita algún mecanismo de comunicación inter-procesos".

Sin embargo hay que tener en cuenta una salvedad, que es un caso en
que
este mecanismo no funcionaría como se espera:

En Windows Vista y Windows 7, hay un mecanismo de seguridad que impide
la
comunicación entre programas con distinto nivel de privilegio (llamado
UIPI - User Interface Privilege Isolation). Esto significa que si
arrancas
la aplicación haciendo doble-click sobre ella (con lo que el UAC te la
ejecuta con permisos de usuario normal), y luego vuelves a ejecutarla con
permisos de administrador (click-derecho, Ejecutar Como Administrador),
entonces te arrancaría una segunda copia porque los mensajes de windows
no
circulan entre las dos versiones. Esto puede ser que te interese o que no
te
interese (a lo mejor sí que quieres permitir dos copias de la aplicación
si
se ejecutan con distintos permisos), pero es algo que hay que tener en
cuenta. En Windows XP este tipo de consideraciones no eran necesarias
porque
no existía el UAC ni el UIPI.



Sí, así es. Lo tenía presente de haberlo leído en la doc de SendMessage
(), y como dice en el remark, puede ser manejado por el programa:
GetLastError() == ERROR_ACCESS_DENIED.

Sí el broadcast no termina en un resultado inteligible se podría
testear si es debido a este error...

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida