Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿como Iniciar Un Programa Desde Otro?en C++

Iniciado por vitchok, 27 de Febrero de 2004, 05:54:24 PM

« anterior - próximo »

vitchok

 pues eso ,con que codigo puedo ejecutar una aplicacion externa en C++
es q necesito hacer un programa que haga eso


gracias  (nooo)  

Astharoth

 
Esto...

Hay varias opciones:

ShellExecute / ShellExecuteEx <--- Claro que estas tambien lanzan "documentos" a traves de sus programas relacionados.
WinExec <-- De API, pero condenada a desaparecer y desacosenjan su uso.
CreateProcess <--- La indicada si quieres tener control del proceso... pero un tanto liosa para la primera vez ;)

Yo particularmente siempre he usado CreateProcess, dale un ojo a la msdn (msdn.microsoft.com) ahi tienes documentadas las tres funciones.

Un Saludo.

Thenend

 Se te ha olvidado la más típica:

int system( const char *command );

tamat

 Y una vez lanzas ese proceso tengo varias dudas:


- Puedes comunicarlos directamente (a traves de alguna región de memoria compartida) o es necesario hacer uso de sockets locales?
- Si los comunicas puedes pasar referencias a la memoria interna de cada proceso para que desde el otro haga lectura/escritura o eso es peligroso?
- Como sabes cuando muere el proceso?

Si sabeis de algun buen tuto (a poder ser lejos de las msdn) lo agradecería.
Por un stratos menos tenso

Astharoth

 Hola.

Citar
- Puedes comunicarlos directamente (a traves de alguna región de memoria compartida) o es necesario hacer uso de sockets locales?

Depende. Supongamos que haces una DLL, y esta DLL la usan dos procesos. La DLL puede definir una variable "shared" que es compartida por ambas instancias de la DLL (una en cada proceso).
Por otra parte, puedes usar un filemapping (es como crear un fichero pero que estan en memoria y es compartible por varios procesos).
Tambien puedes usar lo que tu apuntas, sockets locales.
Y luego ya mecanismos mas "avanzados", tipo COM o LPC/RPC.

Te recomiendo el filemapping.  Es rapido, admite buena cantidad a compartir,etc.

En cualquier caso, mucho ojo si es para plataforma NT con los descriptores de seguridad el contexto de seguridad en el que corre cada proceso (ya que eso podria hacer que no se pudiera acceder al filemapping)


Citar- Si los comunicas puedes pasar referencias a la memoria interna de cada proceso para que desde el otro haga lectura/escritura o eso es peligroso?

Pues, depende de lo que hagas exactamente.. pero mientras sea "uno escribe y el otro lee" en principio no tendrias problema, claro que necesitarias algun tipo de sincronizacion para decirle "eh, te he pasado eso, pillalo". Puedes usar Named Events (vamos, un CreateEvent pero con nombre).

Si es para compartir datos (en plan buffer) tira de Mutex.

Citar
- Como sabes cuando muere el proceso?

Si haces un OpenProcess obtienes un handle al proceso (o al hacer el createprocess).
Un WaitForSingleObject sobre ese objeto te dira si ha muerto o no.

CitarSi sabeis de algun buen tuto (a poder ser lejos de las msdn) lo agradecería.

Ufff... eso chungo... rebusca por aqui o bien tira alguna busqueda de google con las palabras "clave".. a ver si sale algun snipet de codigo decente.

Un Saludo.

tamat

 Gracias Astharoth, ya me hago más o menos una idea ;)
Por un stratos menos tenso

MA]Mestre

 
CitarPuedes comunicarlos directamente (a traves de alguna región de memoria compartida) o es necesario hacer uso de sockets locales?

Los procesos no pueden compartir regiones de memoria. Cada uno tiene un espacio de direcciones de 4GB, sobre el cual trabajan, los punteros se crean en base a ese espacio de direcciones. Estos punteros 'virtuales' son 'convertidos' en punteros a direcciones reales de memoria por las CPU. La arquitectura de las CPU estan preparadas para esta gestion de memoria protegida. La única forma de porder 'entrar' en regiones de otro proceso es colgando DLL/s con Hooks.

Astharoth, ya te comento, posibles opciones.

Para hacer variables shared en DLL --> aqui. Que la variable se comparta, ok, que un puntero se comparta, ok, pero vigila, la dirreccion de memoria de un puntero sera relativa a los 4GB de espacio de direcciones del proceso que lo reservo.

Citar- Si los comunicas puedes pasar referencias a la memoria interna de cada proceso para que desde el otro haga lectura/escritura o eso es peligroso?

Con lo anterior queda respondida.

Di deseas sincronizar bloques de código entre procesos, pues a tirar de objetos del nucleo como Mutex o Semaphores.

CitarComo sabes cuando muere el proceso?

GetExitCodeProcess. La api WaitForSingleObjet, si bien tb te sirve, esta mas orientada a sincronizacion.

Un saludo.

P.D: un tuto ? la MSDN no lo dudes, siempre la mas precisa... ...o no xD

vicho

 yo en su tiempo lo que utilizaba mucho era popen, ahi leias y escribias en la entrada y salida de igual forma a como haces con un FILE pointer
espero que sirva






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.