Komponent DosCommand - ukrycie wysyłanej komendy

Odpowiedz Nowy wątek
2016-01-16 10:01
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.

edytowany 1x, ostatnio: Technics123, 2016-01-16 10:16

Pozostało 580 znaków

2016-01-16 10:35
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.

Pozostało 580 znaków

2016-01-16 11:11
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;
edytowany 4x, ostatnio: Technics123, 2016-01-16 11:36

Pozostało 580 znaków

2016-01-16 11:57

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/[...]nsole_Output_Realtime_To_Memo

Pozostało 580 znaków

2016-01-16 11:58
0
DosCommand1.SendLine('@ipconfig',True);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-01-16 12:26
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.

edytowany 1x, ostatnio: Technics123, 2016-01-16 12:27

Pozostało 580 znaków

2016-01-16 12:30
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-01-16 13:33
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 :)

Tam gdzie komentarz: // S - result tam masz napis S - robisz z nim co chcesz, np Memo1.Text:=S; - _13th_Dragon 2016-01-16 13:41

Pozostało 580 znaków

2016-01-16 13:36
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.

Pozostało 580 znaków

2016-01-16 19:19
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.
No to fajnie w takim razie :) - Mr.YaHooo 2016-01-18 16:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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