Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar codigo de dos dentro de Programa Delphi (https://www.clubdelphi.com/foros/showthread.php?t=32611)

JELIRM 10-06-2006 18:04:54

Ejecutar codigo de dos dentro de Programa Delphi
 
Hola Foro,
Como puedo hacer para que en un programa en Delphi me ejectute una linea de codigo de msdos. esto viene a raiz de que tengo el siguiente codigo Bat

@echo.
@ipconfig | find "IP Address"
@echo.
@pause

Que lo que hace es devolver la ip a una determinada maquina de una red que me haya hecho esa peticion, este codigo lo quiero plasmar en un programa delphi ¿como hago? tengo la idea que deberia ser con ShellExecute pero no se como usarlo.


Gracias de antemano..

fer21unmsm 10-06-2006 19:47:53

Hola Jerlim léete el siguiente hilo allí puede estar la solución a lo que buscas.

Saludos.

seoane 10-06-2006 21:40:59

Revisa este truco , en el se explica una funcion que pasandole como parametro el comando de dos te devuelve el resultado en un string

JELIRM 11-06-2006 18:21:12

Funciona con cualquier version de DOS??
 
season, mira esta funcion funciona con el ms-dos de Windows 9x???
porque segun el codigo pareciera que solo funciona de Win NT para arriba que se abre la consola del dos con CMD.
funcionaria para el "command" de windows 9x???

y gracias season por tu respuesta y tambien a ti fer21unmsm..

seoane 11-06-2006 18:32:54

Funciona tambien en Windows 9x. La razon de que compruebe en que version de windows estoy es porque en windows 9x algunos parametros son ignorados. Ademas observaras que en vez de usar la ruta del cmd.exe o del command.com utilizo la variable de entorno COMSPEC donde se guarda la ruta del interprete de comandos, asi dependiendo de en que sistema operativo se ejecute utilizara uno u otro.

PD: ;) Me llamo Seoane

JELIRM 11-06-2006 18:50:30

Gracias seoane je,je y perdona pero es que tambien se parece a esta palabra inlgesa; asi que diculpa nuevamente, y ahorita voy a probar esa funcion, te comento mis resultados y problemas que esto conlleve gracias..

JELIRM 11-06-2006 21:36:37

seoane fijate que funciona de maravilla la funcion pero solo en mi pcquiero pero la funcion o la finanlidad de hacer esto era que esta aplicacion la voy a tener en una pc como SERVIDORA, entonces cuando otra maquina(Cliente) corra la aplicacion(Como ShourtCut) al Servidor le devuelva la ip pero de la maquina cliente.
lo hice pero en lugar que me devuelva la ip me devuelve el siguiente mensaje de error:
"CMD.EXE was started \\Nombre maquina del Servidor as the current directory path.UNC paths are not supported defaulting to windows directory."
y seguido a este mensaje me muestra la ip 10.xx.xx.xx (de la Cliente)la cual es correcta pero ese mensaje de error me hace clavo ahi.

gracias por tu ayuda.

seoane 11-06-2006 22:18:31

A primera vista parece que le problema es debido a que cmd no permite usar una carpeta remota como directorio actual. Pues bien, le diremos que use otro, por ejemplo el de windows. En vez de esta linea:

Código Delphi [-]
if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then

Coloca esta otra:
Código Delphi [-]
if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, 'C:\Windows\', si, pi) then

Eso deberia de solucionar ese error.

JELIRM 12-06-2006 01:39:48

Gracias seoane fijate que solucione el problema, la cuestion era que yo lo estaba haciendo con un acceso directo de la cliente al servidor; pero para solucionarlo hice un maping desde la cliente al servidor y Zaz!!! funcionó!! mapeando accede a todos los recursos como local, por eso no funcionaba en el acceso directo.
Pero ahora tengo otro problemita, y es que a veces no se porque cuando lo ejecuto el programa desde la cliente no me sale la ip sale null(en blanco) y cierro lo aplicacion y vuelvo a correr hasta que sale pero es en un orden aleatorio a veces me sale a la primera y a veces no, cosa que no sucede cuando lo ejecuto en el servidor como local.
te mostraré el codigo que tengo.
ponle atención al evento create del formulario ya que ahi puse mi codigo lo demós tu lo sabes mejor que nadie; pero lo puse completo para que lo veas talvez estoy fallando en el orden del codigo. pero mejor hechale un vistazo


Código:

unit Principal;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    MainMenu1: TMainMenu;
    Acercade1: TMenuItem;
    Salir1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Acercade1Click(Sender: TObject);
    procedure Salir1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 
implementation
uses Acerca;
{$R *.dfm}
 function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;
function CmdExec(Cmd: string): string;
var
  Buffer: array[0..4096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
begin
  Result:= '';
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + Cmd));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PChar(@Buffer));
          end;
          Application.ProcessMessages;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ResultadoWin9x:String;
ResultadoWinNT:String;
BanderaWin9x:String;
begin
Label1.Caption:='';
  //Corre comando de Dos para Ip de WindowsNT hacia abajo
ResultadoWin9x:=(CmdExec('WINIPCFG | find "IP Address"'));
ResultadoWin9x:=StringReplace(ResultadoWin9x,'IP Address','',[rfReplaceAll]);
BanderaWin9x:=copy(ResultadoWin9x,2,8);

//Valida si La pc no Windows NT hacia abajo
if BanderaWin9x = 'WINIPCFG' then begin;
          //Corre comando de Dos para Ip de versiones windos WindowsNT y posterior
              ResultadoWinNT:=(CmdExec('IPCONFIG | find "IP Address"'));
              ResultadoWinNT:=StringReplace(ResultadoWinNT,'IP Address','',[rfReplaceAll]);
              Label1.Caption:='Su Dirección IP es:'+(ResultadoWinNT);
        end
            else
                  begin;
                  if BanderaWin9x <> 'WINIPCFG' then begin;
                        Label1.Caption:='Su Dirección IP es:'+(ResultadoWin9x);
                    end;
            end;
end;
procedure TForm1.Acercade1Click(Sender: TObject);
begin
Form2.showmodal;
end;
procedure TForm1.Salir1Click(Sender: TObject);
begin
close;
end;

end.


y gracias de nuevo

seoane 12-06-2006 02:04:37

Si lo unico que quieres es obtener la ip del equipo creo que te estas liando demasiado. Usa esta funcion para hacerlo:

Código Delphi [-]
uses Winsock;

function ObtenerIP : String;
var
  HostEnt: PHostEnt;
  Buffer: array[0..256] of Char;
  WSAData : TWSAData;
begin
  Result:= '';
  if WSAStartup(MAKEWORD(1, 1), WSAData) = 0 then
  begin
    if GetHostName(@Buffer, Sizeof(buffer)) = 0 then
    begin
      HostEnt := gethostbyname(@Buffer);
      if HostEnt <> nil then
        Result := inet_ntoa(PInAddr(HostEnt^.h_addr_list^)^);
    end;
    WSACleanup;
  end;
end;

JELIRM 12-06-2006 16:54:51

GRACIAS DE NUEVO
mira y como utilizo la funcion para que me devuelva el resultado en un string??

edelphi 13-06-2006 16:17:22

Ayuda
 
Hola Amigos, yo estoy buscando algo similar a esto; lo que deseo es hacer una backup de mi base de datos en posgresql, me dijeron que eso se hace por consola y no se que parametros le tendria que enviar para que desde un form se cree automaticamente.

estoy trabajando en delphi 7.0 con POsgesql 8, SO WinXP conexion ADO
espero sus respuestas y de antemano gracias

JELIRM 13-06-2006 18:04:45

Funciono!!!
 
Gracias seoane por toda la informacion que me proporcionaste, revise bien el codigo ultimo que me distes y ya se usar la funcion realmente no se le mete parametros sino que de una sola vez te lo da asi que por si alguien mas quiere usuarla es asi:
Código:

Var
ResuladoIP:String;
begin
ResultadoIP:=(ObtenerIP);

y ya!!! asi de simple todo lo hace la funcion no hay necesidad de parametros ni nada.. y lo mejor de todo que esta funcion no ve si es un windows 98, 95 nt 2003 xp o lo que sea.

//Las Caidas te hacen aprender a caminar

JELIRM 13-06-2006 18:19:35

mira si lo que quieres es hacer un backup has lo siguiente:
copia la funcion CMDEXEC justo abajo de implementation y luego en un boton pones el codigo que abajo te describo.


codigo de Funcion

Código:


function CmdExec(Cmd: string): string;
var
  Buffer: array[0..4096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
begin
  Result:= '';
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + Cmd));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PChar(@Buffer));
          end;
          Application.ProcessMessages;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;

y luego en un boton pon el siguiente codigo, en mi caso lo puse en el Create del formulario.
y pones un Tlabel para que veas tu resultado de tu backup

Código:


procedure TForm1.FormCreate(Sender: TObject);
var
ResultadoComando:String;
begin
 //Corre comando de Dos
ResultadoComando:=(CmdExec('copy bases*.Extencion c:\Backup'));
//Despliega como que fuera la ventana del dos en tu form del resultado del comando .//
 
Label1.caption:=ResultadoComando;
end;
end.

y listo!!!!!!!!!

edelphi 15-06-2006 05:20:49

ok amigo muchas gracias por la informacion voy aprobarla y te digo si me funciono o no ok gracias nuevamente

edelphi 06-02-2007 22:38:11

y si fuese con MySql
 
holas amigos ahora la idea es hacerlo con MySQL claro lo mismo con un formulario para crear el backup y tambien para restaurar la Base de Datos y que no me genere conflictos al momento de cargar la BBDD

ok amigos muchas gracias de antemano por sus respuestas


La franja horaria es GMT +2. Ahora son las 02:09:52.

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