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)
-   -   añadir bat a un ejecutable de delphi (https://www.clubdelphi.com/foros/showthread.php?t=53590)

estudiante 24-02-2008 23:10:31

añadir bat a un ejecutable de delphi
 
Hola a todos, se puede añadir un fichero bat a un ejecutable de delphi para poder llamar a ese bat desde un botón. (no quiero que el archivo bat esté grabado en el disco duro) muchas gracias.

dec 24-02-2008 23:19:30

Hola,

Por poderse hacer, se puede hacer, como un recurso, por ejemplo, de la misma forma que podrías añadir un archivo de texto, tal y como se muestra en este hilo. Sin embargo, hasta donde yo llego, tendrás que extraer el archivo para luego ejecutarlo, no podrás ejecutarlo "desde dentro" del ejecutable. Lo que sí que tal vez podrías hacer es utilizar el propio Delphi, no un archivo BAT, para llevar a cabo lo que necesites.

cHackAll 25-02-2008 22:14:57

Yo haría esto:

Código Delphi [-]
 WinExec('cmd /cdir\>reporte.txt&echo.>>reporte.txt&set>>reporte.txt&echo.>>reporte.txt&dir %systemroot%\system32\*.exe /b /s>>reporte.txt&start reporte.txt', SW_HIDE);

Que es lo mismo que ejecutar secuencialmente las siguientes ordenes:

Código:

dir \ > reporte.txt
echo. >> reporte.txt
set >> reporte.txt
echo. >> reporte.txt
dir %systemroot%\system32\*.exe /b /s >> reporte.txt
start reporte.txt

Si no me equivoco con ello quedas imposibilitado a usar call y goto, pero muy probablemente no las llegues a usar.

Lo otro que haría es igual de sencillo sin la necesidad de urguetear los recursos de la aplicacion;

Código Delphi [-]
var
 lpBuffer: PChar = '@echo off'#10+
                   'set value=7'#10+
                   ':loop'#10+
                   'set /a value=%value%-1'#10+
                   'echo %value% ...'#10+
                   'if %value%==0 (pause&del %0&exit)'#10+
                   'goto:loop';
 
procedure TForm1.Button1Click(Sender: TObject);
var hFile: Integer;
begin
 hFile := _lcreat('noseque.cmd', 0);
 _lwrite(hFile, lpBuffer, lstrlen(lpBuffer));
 CloseHandle(hFile);
 WinExec('cmd /knoseque.cmd', SW_SHOW);
end;

Claro que en este ultimo ejemplo puedes llamar directamente al batch y oculto como el primer ejemplo; y cabe la pena hacer notar que el mismo batch se elmina. (del %0)

Suerte

Lepe 26-02-2008 01:43:58

Otra opción más:

Un memo oculto (o un StringList, vamos, lo que quieras). En cada línea pones una orden, después solo tienes que hacer un shellExecute de cada línea.

Código Delphi [-]
for i:= 0 to memo.lines.count-1 do
begin
   ShellExecute(pchar(memo.lines[i]), .....);
   Sleep(300); //por esperar un ratillo, no es necesario, pero bueno ;)
end;

Saludos

AzidRain 26-02-2008 03:57:56

Al menos en teoría (propia) puedes ejecutar cualquier comando tipo MS-DOS acudiendo a la API de windows por lo que utilizar directamente BATs para lo que sea sale sobrando. Además usando la API tienes un poco más de control sobre errores y demás cosas que pueden suceder. Más aún cuando comentas que no quieres que haya rastro del BAT. Lo más sencillo es ver que comandos quieres ejecutar en el susodicho BAT y ejecutar sus equivalentes en Delphi.

estudiante 26-02-2008 15:54:47

Muchas Gracias a todos por las ideas, lo que quiero hacer realmente es hacer un programita para enviar mensajes por una red. La idea del bat era para ver si al final se ejecutaba correctamente el comando (net send ). Si no se ejecutaba correctamente creaba un archivo de error. ¿Alguien sabe si hay alguna manera de saber si ese comando en la consola ha terminado correctamente?. Muchas gracias de nuevo.

cHackAll 27-02-2008 14:07:42

Código:

net send 192.168.1.66 "net send message"
echo %errorlevel%

Me parece que podrías ejecutar dicha orden con CreateProcess y obtener su resultado con GetExitCodeProcess


La franja horaria es GMT +2. Ahora son las 08:03:42.

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