Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Lanzar programa desde mi programa (https://www.clubdelphi.com/foros/showthread.php?t=12272)

Pablo Carlos 11-07-2004 19:26:24

Lanzar programa desde mi programa
 
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

Cita:

Empezado por eduarcol
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

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:

Código:

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

Código Delphi [-]
 
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

Código Delphi [-]
 
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

Código Delphi [-]
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
Código Delphi [-]
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:

Código Delphi [-]
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

Anclar las dos aplicaciones.....
 
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
Código:

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:
Código:

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
Código:

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
Código:

  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:
Cita:

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

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.
Código:

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!


La franja horaria es GMT +2. Ahora son las 01:03:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi