PDA

Ver la Versión Completa : Problema al ejecutar archivo


Furyxe
07-05-2012, 20:13:57
Buenas a todos.

Estoy intentando, desde un programa delphi, realizar una instalacion de 4 programas, de manera automatica.
Ya he realizado los instaladores en modo silencioso. Pero por alguna razon no se abren desde mi programa delphi.

Mas explicado:
Cuando yo a mi instalador le doy doble click con el raton, el instalador se ejecuta minimizado, realiza sus operaciones y desaparece.
Cuando desde delphi yo uso "ShellExecute", "WinExec", "createProcess" entre otros, el instalador hace el "intento" de abrir, pero se cierra de inmediato sin realizar ninguna operación.

Llevo varias horas comiendome la cabeza, pero no se el por que no se abre. Cabe afirmar, que si se abren otros procesos como la calculadora de windows. Asi que he llegado a pensar que es culpa del instalador, pero entonces vuelvo a lo mismo, si lo ejecuto manualmente si funciona.

un ejemplo del uso:
ShellExecute(Handle, 'open', PWideChar('.\Instaladores\Enemy-Territory.exe'),
nil, nil, SW_SHOWNORMAL);


Alguna idea?, solo me falta esta parte para tener una de las partes mas tediosas de mi programa acabado, y solo me faltaria darle soporte a varios idiomas.

Gracias, y Saludos

dec
07-05-2012, 20:21:43
Hola,

Prueba a usar rutas absolutas en lugar de rutas relativas. Más o menos algo como esto:


var
exePath : string;
rootDir : string;
begin
// Ruta del directorio de nuestra aplicación
rootDir := ExtractFilePath( ParamStr( 0 ) );

// Ruta del ejecutable de "Enemy-Territory"
exePath := rootDir + 'Instaladores\Enemy-Territory.exe';

if FileExists( exePath ) then
begin
ShellExecute
(
Self.Handle,
'open',
PChar( exePath ),
nil,
nil,
SW_SHOWNORMAL
);
end
else
begin
raise EInOutError.CreateFmt
(
'El ejecutable "%s" no está donde debe',
[ exePath ]
);
end;
end;

Furyxe
07-05-2012, 20:27:00
Gracias por la respuesta tan rapida :D

Por desgracia, ya habia intentado el tema de las rutas absolutas, aun asi he vuelto a intentarlo con tu codigo facilitado, y el resultado es el mismo. El hecho no esta en que no se abre. Sino en que intenta abrirse, sale el icono en la barra, pero se cierra automaticamente por alguna razon.

dec
07-05-2012, 20:37:50
Hola,

Tal vez podrías echar un vistazo intentar averiguar de qué error se trata, luego de ejecutar la función "ShellExecute()" (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx). Sin embargo, me temo que el problema pueda venir el propio programa que se trata de instalar: tal vez no se "deje" instalar, ignoro porqué razón, pero si, como dices, el programa se ejecuta y se cierra... no sé hasta qué punto puedes controlarlo, puesto que se trata de un programa "externo". ¿Qué pasa si ejecutas el ejecutable tú mismo desde Windows? ¿Funciona bien?

Furyxe
07-05-2012, 20:50:01
Buenas.

Como digo arriba, el hecho es que si ejecuto manualmente desde windows si anda todo.

NOTA: SOLUCION ENCONTRADA PARCIALMENTE: Parece ser, no entiendo por que, si creo un acceso directo de los archivos que quiero abrir, y ejecuto el acceso directo en vez del archivo directamente, si funciona...

No le veo logica al por que funciona con el acceso directo, pero no con el archivo directamente. Y aunque el problema en si este solucionado de una manera chapucera, me gustaria que si es posible, encontremos la razon de este comportamiento ^^

dec
07-05-2012, 20:56:42
Hola,

Hace poco implementé cierta función en un programa que comprobaba quién era su "padre", entiendo como padre quien lo había ejecutado: básicamente Windows u otro programa. De este modo, sería posible actuar de una manera u otra dependiendo de quién ejecute un programa: si es Windows, se sigue adelante, si no lo es, se termina su ejecución. No digo que este sea el caso, pero, sí quiero hacer ver que el comportamiento de un programa de terceros, puede hacer este tipo de cosas u otras que afecten a su ejecución. Esto tal vez podría mirarse (digo en el propio ejecutable, sin disponer de su código fuente), pero, me temo que yo no llego a tanto.

P.D. Intenta encontrar información sobre si el programa en cuestión acepta algún argumento o algo. Por lo demás, ¿esto te ocurre con uno de los programas o con todos ellos? Porque ya sería raro que todos coincidieran en el mismo "problema"... y tal vez estemos dando palos de ciego. ¿Tal vez usar algo como "CreateProcess" en lugar de "ShellExecute()"? ¿Has comprobado el resultado de la función "ShellExecute()"?

Furyxe
07-05-2012, 22:44:51
He usado ShellExecute, WinExec, y CreateProcess. Todos con el mismo error.

En cuanto al programa que quiero abrir, es un instalador que se abre en modo silencioso. El instalador lo he creado yo, con el programa "Setup Factory 9".

EDIT: Por cierto, lo que falla son solo los setup creados con el programa anterior, al intentar abrir otra aplicacion de windows, la abre correctamente. Y el setup no admite parametros, ya que lo hace todo de modo silencioso.