Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

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;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
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.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
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ı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,
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ı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDaha ö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ş
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#5
Merhaba,
Bu konu ile ilgili bir makalemi paylaşmak istiyorum.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
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ı: 23)
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ı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlZamanı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.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#8
(18-09-2016, Saat: 00:18)QuAdR Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlZamanı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ı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlZamanı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

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firma Bilgilerini Almak glagher 3 236 22-09-2018, Saat: 21:02
Son Yorum: sabanakman
  delphi ile web servis yazmak. Kamuran Alpkaya 4 1.169 20-09-2018, Saat: 18:08
Son Yorum: Bay_Y
Question OpenSSL .dll sorunu delphi 10.2 BY-HAYALET 5 406 12-09-2018, Saat: 17:08
Son Yorum: uparlayan
  Visual Studio Code for Delphi gjamesbond 1 110 11-09-2018, Saat: 10:19
Son Yorum: Fesih ARSLAN
  Delphi içinden ve MSSQL üzerinden storeprocedure çalıştırma Bay_Y 6 250 30-08-2018, Saat: 13:10
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi