PDA

Ver la Versión Completa : 2 llamadas a ShellExecute


D-MO
23-08-2006, 01:09:33
Hola, que tal, pues aquí iniciandome en delphi otra vez.

El problema que ahora me surge es el siguiente:
Necesito ejecutar un programa y lo hago meidante shellexecute, al terminar este debe ejecutar un segundo programa generado por la primera llamada a shellexecute, el problema está en que si coloco los 2 shellexecute juntos no me ejecuta el segundo pues este no ha sido ejecutado aún.

Lo que necesito saber es como puedo hacer para ejecutar el segundo shellexecute hasta que haya finalizado el primero.
Agradezco sus comentarios.

Saludos.

dec
23-08-2006, 01:23:24
Hola,

Echa un vistazo en el apartado de Trucos (http://www.clubdelphi.com/foros/../trucos/) Darwin. Concretamente busca trucos con la palabra clave "ejecutar" y verás. ;)

D-MO
23-08-2006, 01:52:21
Echa un vistazo en el apartado de Trucos (http://www.clubdelphi.com/foros/../trucos/) Darwin. Concretamente busca trucos con la palabra clave "ejecutar" y verás. ;)
Muchísimas gracias David, no se como se me pasaron por alto los trucos.

Saludos.

D-MO
23-08-2006, 02:11:05
Hola de nuevo David, dejame decirque que tengo un pequeño problema con esta función, y es que necesito enviarle parámetros al programa a ejecutar.
ShellExecute(Form1.Handle, nil,pChar(Comp.Path+Comp.ExeName),pChar(ActiveFile), nil, SW_SHOWNORMAL);
donde ActiveFile es el parámetro que necesito pasar a el archivo a ejecutar.

Me hechas una mano?

saludos.

seoane
23-08-2006, 02:14:31
Hola de nuevo David, dejame decirque que tengo un pequeño problema con esta función, y es que necesito enviarle parámetros al programa a ejecutar.

ShellExecute(Form1.Handle, nil,pChar(Comp.Path+Comp.ExeName),pChar(ActiveFile), nil, SW_SHOWNORMAL);

donde ActiveFile es el parámetro que necesito pasar a el archivo a ejecutar.

Me hechas una mano?

saludos.

¿y cual es el problema? :confused:

D-MO
23-08-2006, 02:17:39
¿y cual es el problema? :confused:
jejejeej, lo siento, lo que pasa es que con shellexecute lo hago como lo expresé arriba y todo bién pero me ejecuta el shellexecute uno tras otro y necesito esperar a ejecuar el segundo cuando termine el primero.

Intento hacerlo como lo explican en el truco:
http://www.clubdelphi.com/trucos/index.php?id=168&scroll=0&scrollb=0
Pero no se como pasarles los parámetros extras al ejecutable.

Gracias por contestar Seoane.

Slaudos.

seoane
23-08-2006, 02:37:35
En principio solo tienes que pasar el programa que quieres ejecutar y los parámetros separados por espacios, es decir, si quieres ejecutar el notepad y pasarle como parámetro hola.txt, deberías de hacer algo como esto:


WinExecAndWait32('notepad.exe hola.txt',sw_show);

seoane
23-08-2006, 02:41:25
También puedes modificar la función un poquito:


function Ejecutar(Filename, Param: string; ShowWindow: WORD): DWORD;
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
GetStartupInfo(StartupInfo);
StartupInfo.wShowWindow:= ShowWindow;
if CreateProcess(nil,PChar(Filename + ' ' + Param),nil,nil, FALSE,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,
ProcessInfo) then
begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end else
Result:= DWORD(-1);
end;


// Ejemplo de uso
Ejecutar('notepad.exe','hola.txt',sw_show);

D-MO
23-08-2006, 05:54:36
En principio solo tienes que pasar el programa que quieres ejecutar y los parámetros separados por espacios,

Pues ya había intentado esto pero supongo que en algo me equivoque pues no me funcionó, en todo caso si funciona. Gracias.

Me quedo con la función ejecutar que me diste, es mucho mas corta y me confunde menos:p. He cambiado el valor de retorno a booleano para colocarlo dentro de un if y si devuelve true ejecuto el siguiente código.

He comentado la línea:
GetExitCodeProcess(ProcessInfo.hProcess,Result);
puesto que involucrava la variable result y debería ser como DWORD y no BOOLEAN, hay algun problema si la dijo asi?


Además, me gustaría tomar el resultado de la ejecución del programa, es decir, lo que mostraría este programa en consola.

En lo que trabajo es un editor, el cual, junto con FreePascal puedo crear/editar/compilar aplicaciones escritas en pascal pero necesito saber cual es el resultado de la compilación, si hubieron errores y ya saben, los mensajes que te manda el compilador si compilas en consola.

Agradezco cualquier comentario.

Saludos y Gracias.

D-MO
23-08-2006, 06:25:06
Este (http://dechiqui.com/dEdit.zip) es el programa del que hablo, ya incluye el compilador y un archivo de ejemplo que podrán abrir usando el menu "Archivo->Abrir" (Obvio jeje).

No puedo poner el código en estos momentos puesto que está un "poco" desordenado y mal organizado pero luego si estará a disponibilidad de todos, agradecería que me comentaran que les parece.

Saludos.

roman
23-08-2006, 07:15:12
Pues no tengo ni idea de qué es, para qué sirve ni por qué tantos archivos y ejecutables. A primera vista parece un pascal script (http://www.remobjects.com/page.asp?id={9A30A672-62C8-4131-BA89-EEBBE7E302E6}) como el de RemObjects pero no sé si este lo hiciste tú o como es la cosa. Vamos, que un poco de explicación no caería mal. O quieres simplemente que digamos Ohhhh, ¡maestro! ;)

// Saludos

seoane
23-08-2006, 13:49:55
Debo de ser un poco torpe porque no conseguí compilar ni siquiera el programa de ejemplo :) Pero de todas formas si quieres capturar la salida de un programa en un string, puedes usar el truco 54 (http://www.clubdelphi.com/trucos/index.php?id=54). Con la función que aparece en este truco puedes ejecutar un programa o comando y capturar la salida en un string. Creo que es justo lo que estas buscando.

D-MO
23-08-2006, 16:01:20
Pues no tengo ni idea de qué es, para qué sirve ni por qué tantos archivos y ejecutables. A primera vista parece un pascal script (http://www.remobjects.com/page.asp?id=%7B9A30A672-62C8-4131-BA89-EEBBE7E302E6%7D) como el de RemObjects pero no sé si este lo hiciste tú o como es la cosa. Vamos, que un poco de explicación no caería mal. O quieres simplemente que digamos Ohhhh, ¡maestro! ;) Jajajajajajaja mira que si me has hecho reir con esto último jajajaja
Pues mira, si te refieres al dEdit.zip, el único ejecutable que he hecho el el dEdit, ahora lo que se encuentra en los demás directorios a excepcion del directorio /proyects/ es del compilador FreePascal, ¿pero que es dEdit? pues nada mas que un simple editor que con la ayuda de synedit resalta la sintaxis de pascal, tiene la opción de guardar y compilar, lo cual es ta nsimple como escribir en la línea de comandos:C:/ruta/de/freepascal/bin/ppc386 c:/ruta/del/archivo.pas y si la compilación se ejecuta correctamente tendrás un ejecutable de nombre c:/ruta/del/archivo.exeQue es lo que necesito saber, ya el editor me ejecuta y compila pero únicamente si el archivo está escrito correctamente, sin errores, si si hay algun error siempre me tratará de ejecutar el archivo que se supone debió haber creado y me mandará algun error.

Debo de ser un poco torpe porque no conseguí compilar ni siquiera el programa de ejemploNo se a que se deba, pero supongo que el programa no configuró correctamente el directorio en el que lo dejaste, revisa si en el archivo config.ini en la variable "CompilarPah" tienes la ruta de correcta, esta ruta es donde estan situados los archivos, si no es asi, cambia el valor de la variable First a 1 y ejecuta el preograma de nuevo.

Además pudo deberse a que no configurara la tura del fichero de configuración del compilador, para ello revisa el archivo bin/fpc.cfg y busca donde diga
# -----------------------
# Set Filenames and Paths
# -----------------------

# Both slashes and backslashes are allowed in paths

# path to the messagefile, not necessary anymore but can be used to override
# the default language
#-FrC:/Proyectos/Delphi/dEdit/Aplicacion/msg/errore.msg
y compara la última linea con la de tu archivo, debe tener la ruta del ejecutable en tu máquina.


Estoy revisando el truco que me das seoane y aparentemente si es lo que necesito, no lo pruevo ahorita porque voy de salida pero al rato te digo.

Saludos.

Edicion:
Ahhhhhh ya lo olvidava seoane, si cambias el valor de First a 1 e inicias el programa te mandará una ventanita diciendote que el compilador se configuró correctamente, luego revisa si asi fue.

Saludos.

D-MO
23-08-2006, 18:57:14
Avances:

Gracias Seoane, funcionó perfectamente, ya el resultado es capturado y analizado en busca de errores, si los encuentra, detiene la ejecución del nuevo ejecutable.
Un nuevo memo en la parte inferior del editor que muestra los mensajes de error que manda el compilador.
Desde que se ejecuta el programa se puede escribir el código a compilar, luego con dar clic en el boton de compilar (único en la barra de herramientas) guarda y compila.
Aquí (http://dechiqui.com/dEdit_exe.zip)está el dEdit.exe nuevo por si lo desean descargar, solo bastará con reemplazar el dedit.exe anterior con el de ahora y funcionará perfectamente.

Saludos y espero comentarios.