Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda por favor me es urgente

Estas en el tema de Ayuda por favor me es urgente en el foro de .NET en Foros del Web. Hola a todos: Mi problema es el siguiente: He hecho un programa en C# (aplicación Desktop) el cual genera un fichero especifico con una extensión ...
  #1 (permalink)  
Antiguo 24/02/2010, 10:40
 
Fecha de Ingreso: febrero-2010
Mensajes: 4
Antigüedad: 14 años, 9 meses
Puntos: 0
Exclamación Ayuda por favor me es urgente

Hola a todos:

Mi problema es el siguiente:

He hecho un programa en C# (aplicación Desktop) el cual genera un fichero especifico con una extensión definida por mi, yo asocie esta extensión con mi programa de manera tal que al hacer doble clic sobre este fichero inmediatamente se ejecuta mi programa, lee la información del fichero y la carga en la aplicación

Yo hice lo siguiente
Asocie la extensión en el registro de Windows así:
“Ruta de la aplicación” “%1”

Luego en el programa capturo el parámetro de inicio que esta en string[]args que contiene la ruta del fichero y llamo al método que lee el contenido del fichero.

Hasta aquí todo funciona OK.
¿Cuál es el problema?
Pues sencillo, cuando selecciono mas de un fichero y le doy abrir con mi app se me abre una instancia de la aplicación por cada fichero, impedir que se abra mas de una instancia de al aplicación no es problema, el gran problema esta en que yo necesito que cuando se seleccionen varios ficheros y se manden a abrir se me ejecute una sola instancia de la aplicación pero que esta cargue en si todos los ficheros seleccionados, algo así como lo que hace el photoshop cuando seleccionas varias imágenes y das clic derecho -> editar con photoshop.
  #2 (permalink)  
Antiguo 24/02/2010, 14:41
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 16 años
Puntos: 22
Respuesta: Ayuda por favor me es urgente

Si te entiendo bien lo que debes de hacer es implementar un formulario tipo MDI para que dentro de él puedas abrir cada uno de los documentos.

Saludos
  #3 (permalink)  
Antiguo 25/02/2010, 07:51
 
Fecha de Ingreso: febrero-2010
Mensajes: 4
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Ayuda por favor me es urgente

Cita:
Iniciado por gedarufi Ver Mensaje
Si te entiendo bien lo que debes de hacer es implementar un formulario tipo MDI para que dentro de él puedas abrir cada uno de los documentos.

Saludos

Gracias por responderme pero eso ya lo he probado y nada,
la aplicación esta hecha así pero el problema no es con los formularios, para que me entiendas mejor te escribiré aquí un trozo de código similar al de la app.



public Form1(string[] args)
{
InitializeComponent();

if (args.Length > 0)
CargarArchivos(args);

}

private void CargarArchivos(string[] rutas)
{
for (int i = 0; i < rutas.Length; i++)
{
Form2 newMDIChild = new Form2();
newMDIChild.pictureBox1.Image = Image.FromFile(rutas[i]);
newMDIChild.MdiParent = this;
newMDIChild.Show();
}
}
...

Esto funciona ok, el problema esta en que como son varios archivos los que se seleccionaron, windows mediante el parámetro %1 abre una instancia de la app por cada archivo seleccionado, entonces a cada app llega string[]args con longitud 1.
Lo que necesito es lograr que antes de abrir alguna instancia de la app se acumule en una lista todas las rutas y Luego llamar a la app y pasarle la lista entera de una vez.
Yo he probado de muchas formas pero no he resuelto nada hay una forma que logre hacer que es mas o menos asi:

...
if (args.Length > 0)
{
if (Process.GetProcessesByName("Nombre de mi app").Length > 1)
{
StreamWriter sw = File.AppendText(Application.StartupPath + "\\tmp");
sw.WriteLine(args[0]);
sw.Close();
sw.Dispose();
Process.GetCurrentProcess().Kill();
}
else
{
CargarArchivos File.ReadAllLines(Application.StartupPath + "\\tmp"));
File.Delete(Application.StartupPath + "\\tmp");
}
}

...

Aquí lo que hago es obtener la cantidad de instancias de mi app que se han abierto mediante Process.GetProcessesByName si es mayor que 1 escribo su argumento en un fichero temporal (siempre en el mismo) y elimino el proceso, cuando la contidad de instancias es 1 entonces dejo el proceso actual y mando leer las rutas desde el fichero.
Esta idea la he refinado un montón de veces la he pasado para el punto de entrada de la app antes de la llamada a Application.Run(new Form1()); y todos los demás iniciadores de ventanas, esta idea funciona a veces perfectamente pero a veces me da un error de que Windows no tiene memoria virtual o que la aplicación dejo de funcionar y cosas así, ninguno de estos errores son de .net todos son de Windows asi que no tengo forma de controlarlos desde mi app.
  #4 (permalink)  
Antiguo 25/02/2010, 08:46
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 16 años
Puntos: 22
Respuesta: Ayuda por favor me es urgente

Se me ocurre que en lugar de utilizar un archivo puedes utilizar DDE o algun otro mecanismo para que se comuniquen los diferentes procesos de tu aplicación y que segun lleguen los mensajes se valla abriendo cada archivo, aqui te dejo un ejemplo de como utilizar DDE http://www.codeproject.com/KB/cs/Realtime_Quotes.aspx

Saludos
  #5 (permalink)  
Antiguo 25/02/2010, 08:48
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 16 años
Puntos: 22
Respuesta: Ayuda por favor me es urgente

Me encontre este otro ejemplo que creo que se ajusta mas a tu necesidad, http://www.codeproject.com/KB/miscctrl/ddelistener.aspx

Saludos
  #6 (permalink)  
Antiguo 25/02/2010, 15:12
 
Fecha de Ingreso: febrero-2010
Mensajes: 4
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Ayuda por favor me es urgente

Cita:
Iniciado por gedarufi Ver Mensaje
Me encontre este otro ejemplo que creo que se ajusta mas a tu necesidad, [url]http://www.codeproject.com/KB/miscctrl/ddelistener.aspx[/url]

Saludos

Estimado gedarufi te agradezco enormente la ayuda, tenias mucha razón la solución a mi problema no estaba en controlar los procesos así crudamente como yo lo estaba haciendo, el problema es que con tanto trabajo y presiones me había olvidado del viejo Dynamic Data Exchange, tanto que use esto con C++, además el segundo link que me mostraste tiene un ejemplo con esto perfectamente implementado en C#, ya reparé mi programa y ahora si funciona al 100% , muchas gracias por todo, como siempre digo un programador sin colegas no es nadie ja, ja, ja.
Ahorita subo un ejemplillo bien explicado para algunos sitios de código de la Web con esto para que el que lo necesite lo encuentre sin problemas.
Bueno este es mi correo [email protected] si necesitas algo, contáctame.
Saludos y suerte.
xbyte84.
  #7 (permalink)  
Antiguo 26/02/2010, 07:58
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 16 años
Puntos: 22
Respuesta: Ayuda por favor me es urgente

Me alegro mucho que te haya sido util

Etiquetas: favor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:05.