Konuyu Oyla:
  • Derecelendirme: 3/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile cmd komut göndermek ve yanıt almak
#1
Merhaba,

Nette rastladığım faydalı olabileceğini düşündüğüm bir fonksiyon...


function GetCommand(CommandLine: string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE);
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := GetCurrentDir;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            Result := Result + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;

WWW
Cevapla
#2
Merhaba,
Paylaşım için teşekkür ederim. 
Delphi 10 Seattle ve Delphi 10.1 Berlin sürümlerinde test etme imkanınız oldu mu?

Gördüğüm kadarıyla fonksiyon, gönderilen komutun sonucunu da geri döndürüyor.
Bu özellik sayesinde gönderilen komutun, doğru çalışıp çalışmadığının kontrolü açısından son derece kullanışlı olacaktır.
Cevapla
#3
Daha önce kullandım ve sıkıntı yaşamadım. 

Kullandığımda ufak bir fark var :

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): AnsiString;
var
 SA: TSecurityAttributes;
 SI: TStartupInfo;
 PI: TProcessInformation;
 StdOutPipeRead, StdOutPipeWrite: THandle;
 WasOK: Boolean;
 Buffer: array[0..255] of ansiChar;
 BytesRead: Cardinal;
 WorkDir: String;
 Handle: Boolean;
begin
 Result := '';
 with SA do begin
   nLength := SizeOf(SA);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
 try
   with SI do
   begin
     FillChar(SI, SizeOf(SI), 0);
     cb := SizeOf(SI);
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
     wShowWindow := SW_HIDE;
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
     hStdOutput := StdOutPipeWrite;
     hStdError := StdOutPipeWrite;
   end;
   WorkDir := Work;
   Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                           nil, nil, True, 0, nil,
                           PChar(WorkDir), SI, PI);
   CloseHandle(StdOutPipeWrite);
   if Handle then
     try
       repeat
         WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
         if BytesRead > 0 then
         begin
           Buffer[BytesRead] := #0;
           Result := Result + Buffer;
         end;
       until not WasOK or (BytesRead = 0);
       WaitForSingleObject(PI.hProcess, INFINITE);
     finally
       CloseHandle(PI.hThread);
       CloseHandle(PI.hProcess);
     end;
 finally
   CloseHandle(StdOutPipeRead);
 end;
end;
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#4
(16-09-2016, Saat: 19:47)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,
Paylaşım için teşekkür ederim. 
Delphi 10 Seattle ve Delphi 10.1 Berlin sürümlerinde test etme imkanınız oldu mu?

Gördüğüm kadarıyla fonksiyon, gönderilen komutun sonucunu da geri döndürüyor.
Bu özellik sayesinde gönderilen komutun, doğru çalışıp çalışmadığının kontrolü açısından son derece kullanışlı olacaktır.

Delphi 10 Seattle da kullandım sıkıntı yok Wink

(16-09-2016, Saat: 21:02)engerex Adlı Kullanıcıdan Alıntı: Daha önce kullandım ve sıkıntı yaşamadım. 

Kullandığımda ufak bir fark var :


Hiç fark yok aynısı Wink Adı değişmiş
WWW
Cevapla
#5
Merhaba,
Bu konu ile ilgili bir makalemi paylaşmak istiyorum.
Komut Satırından (CMD) Toplu İş Yaptırmak
Cevapla
#6
Zamanın birinde değerli bir arkadaşım için yapmıştım böyle birşey.Ekte derlenmiş hali ve kodlarını bulabilirsiniz.


Ek Dosyalar
.zip   zug.zip (Dosya Boyutu: 2,63 KB / İndirme Sayısı: 66)
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#7
(18-09-2016, Saat: 00:18)QuAdR Adlı Kullanıcıdan Alıntı: Zamanın birinde değerli bir arkadaşım için yapmıştım böyle birşey.Ekte derlenmiş hali ve kodlarını bulabilirsiniz.

Component kullanılmadan yapılmış ve çok da hızlı çalışıyor. 
Teşekkür ederim hocam.
Cevapla
#8
(18-09-2016, Saat: 00:18)QuAdR Adlı Kullanıcıdan Alıntı: Zamanın birinde değerli bir arkadaşım için yapmıştım böyle birşey.Ekte derlenmiş hali ve kodlarını bulabilirsiniz.

Kaynak kod için linke girince "Belirtilen ek dosya forumumuzda mevcut değil." diye hata mesajı veriyor. Linki yenileme imkanınız varmı?
Cevapla
#9
(18-09-2016, Saat: 00:18)QuAdR Adlı Kullanıcıdan Alıntı: Zamanın birinde değerli bir arkadaşım için yapmıştım böyle birşey.Ekte derlenmiş hali ve kodlarını bulabilirsiniz.

Ek mevcut değil yenilermisiniz ?
Cevapla
#10
Güncel...
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Cas Terazi Veri gönderimi Delphi sürüm sorunu KUNTAY 4 509 25-09-2021, Saat: 01:32
Son Yorum: oarikmert@hotmail.com
  Delphi ve PHP arasında Encrypt/Decrypt İşlemi - Yardım mad85 18 9.258 18-09-2021, Saat: 08:58
Son Yorum: MosCom
  Delphi dilinde toplam değer nasıl kodlanır? KursadCK 5 313 01-09-2021, Saat: 13:30
Son Yorum: Mesut
  CMD ile Linux'a Komut Gönderip Cevap Alma Hk. pro_imaj 14 727 04-08-2021, Saat: 12:17
Son Yorum: Tan Ay
  Firebird Server Makinadaki Veri Tabanlarının Listesini Almak MEDCEZİR 5 399 28-06-2021, Saat: 12:19
Son Yorum: esistem



Konuyu Okuyanlar: 1 Ziyaretçi