Komponent DosCommand - ukrycie wysyłanej komendy

0

Witam, czy używa ktoś komponentu DosCommand i wie jak ukryć wysyłane komendy (żeby nie pokazywało ich w memo), walczę z tym już jakiś czas bezskutecznie..
user image

Może ktoś ma alternatywę dla DosCommand ale musi działać przekierowanie wyniku do memo przy użyciu jakiegoś pliku .exe (przykładowo adb.exe)
Testowałem DosInMemo lecz nie działa poprawnie bo albo zawiesza aplikację albo pokazuje w memo tylko czas reakcji i nic więcej.

0

a jak wysyłasz te komendy? może pokaż kod.

nie wiem co to za komponent, ale w pliku .BAT w prawdziwej konsoli można poprzedzić polecenie znakiem @ np. @ipconfig i wtedy to polecenie nie zostanie wypisane w konsoli.

0

Jak wygląda wpisywanie komend:

 DosCommand1.SendLine('ipconfig' , True);

Niestety @ mi tu nie pomoże.

Mojego całego kodu pokazać za bardzo nie mogę ale w załączniku komponent i przykład poniżej

 
procedure TForm1.DosCommand1NewLine(Sender: TObject; NewLine: String;OutputType: TOutputType);
  
begin
  Memo1.Lines.Add(NewLine);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  folder:= ExtractFilePath(Application.ExeName) +'cmd\' ;
  DosCommand1.CommandLine := 'cmd.exe';
  DosCommand1.Execute;                        
  DosCommand1.SendLine('@echo off', True);

  DosCommand1.SendLine('ipconfig' , True); // wysyłana komenda
end;
1

Trochę pokręcone to jak dla mnie. Po co jakieś cmd.exe do wywołania ipconfig? Jeśli to jest samodzielny program typu ping/ipconfig to o wiele prościej będzie napisać sobie funkcje która uruchamia program z podanymi parametrami a następnie przechwytuje wyjście i wypisuje do ListBoxa czy czego tam chcesz. Dużo tego w internecie znajdziesz. Np. tu http://delphi.wikia.com/wiki/Capture_Console_Output_Realtime_To_Memo

0
DosCommand1.SendLine('@ipconfig',True);
0
_13th_Dragon napisał(a):
DosCommand1.SendLine('@ipconfig',True);

Niestety to nie działa
user image

Co do wywoływania cmd to samo ipconfig jest tylko przykładem. Ja tego używam do komunikacji z urządzeniami.
"CaptureConsoleOutput" jakoś tego nie ogarniam za bardzo i będę wdzięczny za przykład zastosowania

Może inaczej, chcę np odczytać dane z telefonu na androidzie używając adb.exe i żeby dane przekierowało do memo bez pokazania komend wysyłanych.
Jakieś pomysły?

Mi sam DosCommand pasuje poza tym że pokazuje co wysyłam.

1

Może to ci pomoże: http://4programmers.net/Forum/977746

0

Już ten temat czytałem ale chyba moje umiejętności w programowaniu są niewystarczające żeby to ogarnąć tak jak bym chciał żeby działało :)

1
Technics123 napisał(a):

Co do wywoływania cmd to samo ipconfig jest tylko przykładem. Ja tego używam do komunikacji z urządzeniami.
"CaptureConsoleOutput" jakoś tego nie ogarniam za bardzo i będę wdzięczny za przykład zastosowania
Ale to przecież jest 1 funkcja której przekazujesz w postaci stringa polecenie oraz drugi string zawierający parametry jakie przekazać do programu. Jako trzeci parametr przekazujesz komponent Memo w którym ma się zapisywać wyjście programu.

0
Mr.YaHooo napisał(a):
Technics123 napisał(a):

Co do wywoływania cmd to samo ipconfig jest tylko przykładem. Ja tego używam do komunikacji z urządzeniami.
"CaptureConsoleOutput" jakoś tego nie ogarniam za bardzo i będę wdzięczny za przykład zastosowania
Ale to przecież jest 1 funkcja której przekazujesz w postaci stringa polecenie oraz drugi string zawierający parametry jakie przekazać do programu. Jako trzeci parametr przekazujesz komponent Memo w którym ma się zapisywać wyjście programu.

Ja nie wiem co się ostatnio ze mną dzieje, faktycznie mega proste i w zasadzie rozwiązuje to mój problem :)

Dziękuję wszystkim za podpowiedzi.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
 const
   CReadBuffer = 2400;
 var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of AnsiChar;
   dRead: DWord;
   dRunning: DWord;
 begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;


if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
     suiStartup.wShowWindow := SW_HIDE;


 if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
   @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
   then
 begin
   repeat
     dRunning  := WaitForSingleObject(piProcess.hProcess, 100);
     Application.ProcessMessages();
     repeat
       dRead := 0;
       ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
       pBuffer[dRead] := #0;

       OemToAnsi(pBuffer, pBuffer);
       AMemo.Lines.Add(String(pBuffer));
     until (dRead < CReadBuffer);
   until (dRunning <> WAIT_TIMEOUT);
   CloseHandle(piProcess.hProcess);
   CloseHandle(piProcess.hThread);
 end;

 CloseHandle(hRead);
 CloseHandle(hWrite);

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     CaptureConsoleOutput('ipconfig','',Memo1);
end;

end.
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1