Social Icons

^^

domingo, 14 de fevereiro de 2010

Executar comando do MS-DOS

Usando WinExec você pode executar qualquer comando do DOS. Para isto chame o COMMAND.COM passando como parâmetro a linha de comando a ser executada. O parâmetro /C é opcional e faz com que a janela do DOS seja fechada assim que o comando terminar. No exemplo abaixo estou executando a seguinte linha de comando: DIR C:\*.* WinExec('COMMAND.COM /C DIR C:\*.*', SW_SHOW);

Observações



Para que a janela do DOS não seja exibida, use SW_HIDE no lugar de SW_SHOW.

6 comentários:

  1. Olá jeferson.
    Fiz o seguinte teste no envento onclick de um botton:
    "
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    WinExec('COMMAND.COM DIR C:\*.*', SW_SHOW);
    end;
    "

    e o dos me retornou o seguinte erro:
    "
    pasta incorreta especificada p/localizaçao de COMMAND
    excesso de parametros
    "

    gostaria de uma ajuda para executar.
    desde já obrigado.

    -Greed

    ResponderExcluir
    Respostas
    1. No caso você tem que colocar /c ou /k logo depois de command porém, pode fazer isso de outras maneiras como, a exemplo do cmd ou pode até capturar os dados de saída do pront, veja;

      WinExec('COMMAND.COM /C Pause', SW_SHOW);
      WinExec(PChar('cmd /k Pause'),sw_normal);

      para obter mais informações sobre o command e o cmd abra o seu pront e digite cmd /? ou command /?


      para executar um comando e capturar a saída do pront use isto:

      Crie uma nova aplicação delphi:

      Insira 1 memo e 1 botão

      declare a seguinte função logo abaixo de {$R *.dfm}:

      function PegarSaidaDOS(Comando, DiretorioTrabalho: string): string;
      var
      saSegunranca: TSecurityAttributes;
      siInformacoesInicializacao: TStartupInfo;
      piInformacaoDoProcesso: TProcessInformation;
      hLeitura, hEscrita: THandle;
      bOk, bHandle: Boolean;
      Buffer: array[0..255] of AnsiChar;
      BytesLidos: Cardinal;
      Diretorio: string;
      begin
      Result := '';
      with saSegunranca do
      begin
      nLength := SizeOf(saSegunranca);
      bInheritHandle := True;
      lpSecurityDescriptor := nil;
      end;
      CreatePipe(hLeitura, hEscrita, @saSegunranca, 0);
      try
      with siInformacoesInicializacao do
      begin
      FillChar(siInformacoesInicializacao, SizeOf(siInformacoesInicializacao), 0);
      cb := SizeOf(siInformacoesInicializacao);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_Hide;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE);
      hStdOutput := hEscrita;
      hStdError := hEscrita;
      end;
      Diretorio := DiretorioTrabalho;
      bHandle := CreateProcess(nil, PChar('cmd.exe /c ' + Comando), nil, nil, True, 0, nil,
      PChar(Diretorio), siInformacoesInicializacao, piInformacaoDoProcesso);
      CloseHandle(hEscrita);
      if bHandle then
      begin
      try
      repeat
      bOk := ReadFile(hLeitura, Buffer, 255, BytesLidos, nil);
      if BytesLidos > 0 then
      begin
      Buffer[BytesLidos] := #0;
      Result := Result + Buffer;
      end;
      until not bOk or (BytesLidos = 0);
      WaitForSingleObject(piInformacaoDoProcesso.hProcess, INFINITE);
      finally
      CloseHandle(piInformacaoDoProcesso.hThread);
      CloseHandle(piInformacaoDoProcesso.hProcess);
      end;
      end;
      finally
      CloseHandle(hLeitura);
      end;
      end;

      No evento onclick do botão insira:

      memo1.Text := PegarSaidaDOS('SystemInfo',ExtractFilePath(Application.exename));


      Veja o resultado. vlw até a próxima. ;)

      Excluir
  2. Muito obrigado Jefferson. Nao entendi muito sobre como capturar a saida o pront, pois sou noob. Mas consegui resolver meu problema inicial.

    Estou aprendendo bastante aqui no blog, vlw!

    -Greed

    ResponderExcluir
    Respostas
    1. Estamos sempre ai para ajudar... Caso você tenha alguma sugestão para publicação, algo que queira saber, tirar alguma dúvida etc... É só mandar um email ou escrever aqui mesmo nos comentários, que eu publico sobre o assunto. vlw t +.

      Excluir
    2. Estou atualizando seu keylogger, apenas adaptando algumas coisas ao meu alcance. Mais adiante gostaria de compartilhar as atualizações caso você permita caso não atrapalhe o super kl claro.
      Pode me passar seu e-mail atual?
      Obrigado.
      -Greed

      Excluir
    3. Claro, sem problemas, eu já ia atualizar o tutorial do kl...
      pode me contactar pelo email: progmasterofficial@hotmail.com

      Excluir

Popular Posts

 

Seguidores

Hora exata:

Total de visualizações de página