PDA

Ver la Versión Completa : Lanzar programa desde mi programa


Pablo Carlos
11-07-2004, 19:26:24
Hola Gente. aqui de nuevo...
Quisiera que mi prg ejecute otro programa por ejemplo el Word... y lo hago asi
WinExec(PChar('C:\ARCHIV~1\Microsoft Office\Office\WinWord.exe'), SW_SHOWNORMAL); hasta aqui todo bien... pero que sucede cuando se instalan nuevos programas? debería modificar mi programa para actualizarlo y me parece un poco rustico...
la idea es crear una base de datos donde yo carge las Path de cada exe y que mi programa, en su código tenga algo asi...

var Ruta : String;

Ruta := Label1.Caption; (o el contenido del campo. que esto no sería problema)
WinExec(PChar('Ruta'), SW_SHOWNORMAL);
Que obviamente no funciona... acepto sugerencias :)
Muchas gracias.... Pablo

eduarcol
11-07-2004, 19:31:21
WinExec(PChar('Ruta'), SW_SHOWNORMAL);

Obviamente si encierras Ruta entre las comillas no te va a funcionar, por que el compilador asumira que quieres ejecutar Ruta, mas no el contenido de Ruta.

Lo que tendrias que hacer es

WinExec(PChar(Ruta), SW_SHOWNORMAL);

Suerte

Pablo Carlos
11-07-2004, 19:37:38
WinExec(PChar('Ruta'), SW_SHOWNORMAL);

Obviamente si encierras Ruta entre las comillas no te va a funcionar, por que el compilador asumira que quieres ejecutar Ruta, mas no el contenido de Ruta.

Lo que tendrias que hacer es

WinExec(PChar(Ruta), SW_SHOWNORMAL);

Suerte
Excelente.... ahora lo que no entiendo es como se me escapan esos detalles tan simples :(
Muchas gracias

Pablo Carlos
11-07-2004, 19:43:46
ahora si quisiera que mi prg se ejecute antes que continue la carga de windows (esto seria tipo usuario) en el registro no encuentro donde... estube buscando en hkey_local_machine -> software -> microsoft -> windows y no lo logro... por alli me dijeron que en la misma ruta pero en windowsnt-> winlogon (pero este winlogon no lo tengo--- estoy hablando de win95 y milenium
Tambien me encanta Venezuela :)

eduarcol
11-07-2004, 20:03:54
Es que dentro de windows debe buscar la carpeta Current Version, y alli encontras winlogon, de todas formas esto puedes seguir discutiendolo en el otro hilo, respetemos la guia de estilo :D

Pablo Carlos
11-07-2004, 20:06:07
ok.... dentro de current version no esta tampoco :( ... y en que hilo puedo seguir este tema? Gracias...

eduarcol
11-07-2004, 20:15:20
Puedes seguir en este Hilo (http://www.clubdelphi.com/foros/showthread.php?t=12107)

Si pruebas creando la clave del registro a ver que sucede

JoseQ
13-07-2004, 18:12:19
y si ademas de ejecutar un programa, keremos k este se abra con un archivo determinado, es decir,abrir x ejemplo un JPG con el imaging de win o con el photoshop. GRacias

eduarcol
13-07-2004, 18:19:17
Solo se lo pasas por parametros:


winexec('"c\Imagen.exe" "c:\dibujo.jpg"')

JoseQ
13-07-2004, 18:46:55
no me traga eso

mi codigo (segun tu version es asi)

windows.WinExec(cadena pchar(hint),1)


donde cadena es la ruta del programa, e Hint es el nombre del fichero que quiero cargar con el programa.

tambien e probrado a concatenar ambas cadenas para utilizar un solo parametro:

strcat(cadena , pchar(hint);
windows.WinExec(cadena ,1);

asi me compila bien, xo en runtime al ejecutar el codigo me abre el programa xo no el archivos

eduarcol
13-07-2004, 18:52:16
lo mas seguro es que la ruta no sea la correcta
prueba copiandolo en la raiz para ver si es eso o no

JoseQ
13-07-2004, 18:57:43
la ruta esta bien




esto es todo lo k ago



procedure TModuloImagenes.Image1DblClick(Sender: TObject);
const max=255 ;
var editor:tsearchrec;
cadena:array [0..max] of char;
begin
strcopy(cadena,'c:\archivos de programa\archivos comunes\microsoft shared\photoed\photoed.exe ' );
with sender as timage do
begin
strcat(cadena,pchar(hint));
showmessage(cadena); // solamente para comprobar la ruta
if FindFirst('c:\archivos de programa\archivos comunes\microsoft shared\photoed\photoed.exe',0,editor) = 0 then
windows.WinExec(cadena pchar(hint),1) else
showmessage('No se encuentra el PhotoEditor');
end;
end;



el (Timage).hint contiene la misma cadena k se a cargado en el picture.loadfromfile, x lo tanto el contenido sera valido, despues le concateno delante la ruta (dejando un espacio en blanco) del photoeditor i lo ejecuto,

el resultado es que me abre el photoeditor pero no me abre la fotografia ...

eduarcol
14-07-2004, 00:53:02
procedure TModuloImagenes.Image1DblClick(Sender: TObject);
const max=255 ;
var editor:tsearchrec;
cadena:array [0..max] of char;
begin
strcopy(cadena,'"c:\archivos de programa\archivos comunes\microsoft shared\photoed\photoed.exe" ' );
with sender as timage do
begin
strcat(cadena,pchar(Image1.Hint));
showmessage(cadena); // solamente para comprobar la ruta
if FindFirst('c:\archivos de programa\archivos comunes\microsoft shared\photoed\photoed.exe',0,editor) = 0 then
windows.WinExec(cadena pchar(hint),1) else
showmessage('No se encuentra el PhotoEditor');
end;
end;

[/QUOTE]

Prueba los dos pequeños cambio que te propongo a ver que sucede, no estoy muy seguro en referencias a objetos, pero creo que el Hint que estas capturando es el del Form y no el del Imagen

jachguate
14-07-2004, 01:28:06
Si los nombres de archivo del programa y del que queres pasar como parámetro contienen espacios, tenes que encerrarlos entre comillas para que el sistema los considere un único parámetro:

por ejemplo:

WinExec('c:\archivos de programa\programa.exe c:\mis documentos\documento.doc');

tratará de ejecutar c:\archivos, pasándole como parámetros:

de
programa\programa.exe
c:\mis
documentos\documento.doc

totalmente erratico, no:

en cambio:

WinExec('"c:\archivos de programa\programa.exe" "c:\mis documentos\documento.doc'");

Tratará de ejecutar:

c:\archivos de programa\programa.exe

con el parámetro:

c:\mis documentos\documento.doc

otra opción es usar solamente nombres de archivo 8.3:

WinExec('c:\archiv~1\programa.exe c:\misdoc~1\documento.doc');

Hasta luego.

;)

JoseQ
14-07-2004, 10:54:34
eduarcol, tu solucion no me sirve, ia k ese procedimiento solo sirve para la imagen1, y tengo 36 imagenes... xD tendria k escribir 36 procedimientos iguales !!! utilizando el parametro server le digo al compilador que objeto es el que4 a llamado al procedimiento, fijate que pongo with sender as timage ... en cuanto a jachguate probare pasando las dos cadenas x separado, xo tengo k pasarle variables, no cadenas literales, no puedo, x tanto ,usar las comillas


eduarcol el hint no es del form, comprobado x showmessage.pertenece a la imagen que llama al procedimiento

Pablo Carlos
14-07-2004, 16:01:14
Por que no le pasas la ruta por un Var por ejemplo...
Var Ruta : string;
Ruta := Edit1.Caption
y la ruta la escribis en un Edit y cuando ejecutas WinExec(Ruta);
Te servira asi?
Saludos

JoseQ
14-07-2004, 16:10:49
la ruta se la paso x variable,

[delphi]
procedure a;
var cadena:array[0..256] of char;
begin
strcopy(cadena,'c:\programa.exe archivo.doc');
winexec(cadena);
end;

pues esto me abre programa.exe xo no me carga archivo.doc

Pablo Carlos
14-07-2004, 16:36:07
Mira lo acabo de probar y funciona...
C:\ARCHIV~1\Microsoft Office\Office\WinWord.exe c:\orden.doc %1
con esa cadena me abre el Word junto al archivo orden
Saludos

JoseQ
14-07-2004, 16:54:22
prueba con el photoeditor del office

c:\archivos de programa\archivos comunes\microsoft shared\photoed\photoed.exe i el archivo de imagen k kieras

Pablo Carlos
14-07-2004, 17:02:30
No tengo el photoed.exe :(
yo lo hago asi:
var Ruta : String;
begin
Ruta := edit.Caption;
WinExec(PChar(Ruta), SW_SHOWNORMAL);
end;
y ruta es igual a C:\ARCHIV~1\Microsoft Office\Office\WinWord.exe c:\orden.doc %1

JoseQ
14-07-2004, 17:16:45
procedure TModuloImagenes.Image1DblClick(Sender: TObject);
var editor:tsearchrec;
cadena:array [0..256] of char;
begin
strcopy(cadena,pchar(photoed));
with sender as timage do
begin
strcat(cadena,pchar(hint));
showmessage(cadena);
if FindFirst(photoed,0,editor) = 0 then
WinExec(cadena,1) else
showmessage('No se encuentra el PhotoEditor');
end;
end;

este es el mio, photoed contiene la ruta del programa, y la propiedad hint del Timage contiene el archivo cargado. concateno ambas cadenas dentro de un array de caracteres y como ya e dicho este codigo abre el photoeditor xo no la imagen;

Pablo Carlos
14-07-2004, 17:23:47
No veo que le agregues a la cadena donde está la imagen esto "%1" sin comillas el
%1 hace que abra esa imagen
Saludos

JoseQ
14-07-2004, 17:50:49
ia abia probado antes agregandole el %1 i tp funciona

JoseQ
16-07-2004, 12:22:55
haber se me a ocurrido una cosa que tiene k funcionar, pero no se como acerlo, parece k k el photoeditor no se quiere abrir, e pensado k en el codigo puedo modificar el registro de windows i decirle k el programa predeterminado para jpg es photoeditor, i ejecutar la foto con shellexecute,komo podria modificar el registro de windows para poner el photoeditor como programa predeterminado y luego volver a poner el k estaba configurado , gracias;

Pablo Carlos
16-07-2004, 16:03:32
Para modificar el registro de windows yo hago esto

var
sKey : string;
reg : TRegIniFile;
begin
reg.WriteInteger('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer'+sKey+#0,'NoRun',1);
reg.Free;
end;

Con esto elimino el Ejecutar del inicio. Deberias examinar el registro donde predetermina con que prg abre tal archivo
Saludos

JoseQ
16-07-2004, 16:49:53
alguien sabe la ruta del registro para definir el programa k abre los jpg x defecto ?¿
en cuanto a lo que me as puesto, k valor tiene sKey ?¿?

k unidad necesito para el treginifile ?

JoseQ
19-07-2004, 11:21:04
weno, y yo sigo con mi pequela rallada, al final e decidido cargar la imagen con shellexecute, i confiando q el usuario tenga definido x defecto el PhotoEditor como programa para abrir las imagenes, e puesto el siguiente codigo:


procedure TModuloImagenes.Photoedi(Sender: TObject);
var editor:tsearchrec;
begin
with sender as timage do
begin
if FindFirst(photoed,0,editor) = 0 then
shellexecute(handle,'open',pchar(hint),nil, nil, SW_SHOW) else
showmessage('No se encuentra el PhotoEditor');
end;
end;

ahora mi problema es que relaciono este procedimiento con los Timage de mi programa, xo no funcionan, solo funciona el Image1, los demas no ace nada, ni tan sikiera entra el procedimiento, alguna sugerencia ?=????



mmmmm, weno, ia solucione esto , un pekeño consejo no intenten acer 15 cosas a la vez, xk fallaran en 16 tonterias

inexperto
25-07-2004, 20:38:12
hola!!!!
tengo una pregunta relacionada al tema.......como puedo anclar las dos aplicaciones. lo que quiero decir es como se hace para cerrar la aplicacion hija y cerrar la aplicacion madre....ah viceverza......esa es mi duda..chau
que esten bien :p

weke
08-09-2004, 09:56:21
Hola a todos!!!

He estado mirando muchos hilos y en internet cosas relacionadas con los comentarios de los hilos pero en no he conseguido nada.
La cuestión es que en mi aplicación tengo que arrancar una serie de servicios para que funcione.
Con uno no he tenido ningún problema, con

WinExec(PChar(Ruta), SW_SHOWNORMAL);

solucionado.
Pero al siguiente servicio que tengo que arrancar, hasta ahora solo se podia hacer desde ms-dos porque hay que pasarle un parametro, no funciona. El código que he utilizado es:

WinExec('cmd.exe C:\Inprise\vbroker\bin\eventos.exe 0',SW_HIDE)

Mi intención es ejecutar un 'command' y después ejecutar la instrucción, pero de esta manera solo se me abre el 'command'.
No se si es que paso mal los parámetros o si simplemente no se puede, pero no lo consigo.
También he probado con ejecutar directamente el servicio

WinExec('C:\Inprise\vbroker\bin\eventos.exe 0',1)

sin arrancar ningún 'command', pero de esta manera, arranca el servicio y en cuanto lo arranca lo mato.

Muchas gracias de antemano y saludos a todos.

argami
08-09-2004, 11:45:59
Lo has probado con el shellexecute????

es que este permite el paso de parametros dento de su definicion.

ShellExecute(Handle, 'OPEN', PChar(Ruta), Pchar(Parametro), PChar(ExtractFilePath(Ruta)), 0)

en ultimo caso hazte dentro del aplicativo un bat que luego lo puedas ejecutar.
en pseudocodigo seria algo como

Inicio
Creabat('C:\Abreprograma.bat');
EjecutaBat('C:\Abreprograma.bat');
fin



Creabat('C:\Abreprograma.bat');
// uno que solo cree el fichero para no tener que distribuirlo con el programa

weke
09-09-2004, 12:51:24
El 'ShellExecute' no me deja hacerlo, me da un error:

undeclared identifier
La línea de código es la siguiente, igual cometo algún error:

ShellExecute(Handle, 'OPEN', PChar(edit1.Text), Pchar(0), PChar(ExtractFilePath(edit1.Text)), 0)

En edit1 esta la ruta del ejecutable, el parámetro que le tengo que pasar es '0'.

Con respecto al .bat, también he probado pasandoselo como parámetro, ejecuta el bat y cierra el 'command', entonces sigue sin funcionar.

cmd := '/ceventos.bat';
...
WinExec(PChar('command.com ' + cmd),1);

Y ejecutando direcctamente el .bat me sigue pasando lo mismo, se cierra y no mata el servicio en cuanto se ejecuta.

Seguramente es que no hago correctamente o se me pasa algo, pero estoy un poco engachao.

Muchas gracias a todos por los consejos.

weke
09-09-2004, 13:23:06
El error del ShellExecute ya esta claro, se me había pasado poner en el uses 'ShellApi'. :D
Pero sigo en las mismas, me lo ejectua y lo mata.
Saludos!

weke
09-09-2004, 13:56:26
Gracias a todos por vuestra ayuda, pero después de darle tantas vueltas, es que al ejecutarlo me da un error con las librerias de java, será alguna tontería. No se porque, ya que ayer por la mañana sin ir más lejos ejecute la instrucción manualmente y funcinó correctamente. Pero he probado en otro ordenador el ejecutable y funciona correctamente.

Gracias otra vez por dedicarme vuestro tiempo.

¡Saludos!