dos komutunda sorun

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seci20

dos komutunda sorun

Mesaj gönderen seci20 »

ustalarım merhaba uzun süredir bu konu uzerınde çalıştıgım halde genede çözemediğim bir sorun var.ilk öncelikle kullandıgım 2 adet dos komutu gondermek ıcın procedur var.1. karsıdan gelıcek komutu beklıyor diğeri ise beklemeden direk geçiş yapıyor.

ilk şu.

Kod: Tümünü seç

function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;

function cmdxcx(Cmd: string): AnsiString;
var
  Buffer: array[0..4096] of AnsiChar;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
  Str: string;
begin
  Result:= '';
  if IsWinNT then
  begin
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end
  else sa.lpSecurityDescriptor := nil;
  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := TRUE;
  if CreatePipe(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + Cmd));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        Str:= #13;
        WriteFile(write_stdin,PChar(Str)^,Length(Str),bread,nil);
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          application.ProcessMessages;
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + PAnsiChar(@Buffer);
          end;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;
ikincisi ise

Kod: Tümünü seç

procedure 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;      <----- update
   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;
yani bunlardan bırısı gercek zamanlı biri değil.Şimdi sorunum şu ornegın alt altta komut gırıyoruz ve gırdıgımız komut ıcerısınde komut calıstırmamız gereklı yanı ornegın adb komutu gondermek ıstıyorum cihazın ıcındekı bir programada komut gonderıcegım ama bu ıkı komutlada onu basaramıyorum.Normal cmd acıp tek tek elle yazdıgım komutu delphide gondermeyı basaramıyorum.Rersimle daha ayrıntılı sekılde gostereyım.


Resim

ustalrım yukardakı gıbı adb komutu tek tek elle yazıp firewater calıstırıldıgını goruyoruz.Şimdi ben ıcerde calısan firewater komut gondermek ıstıyorum.Ama bir turlu basaramadım bir cok arastırma yaptım ama malasef basarılı olamadım...Yardımlarınızı beklıyorum sımdıden cok tesekkur ederım...

Not:ustalarım alt altta yazarak komut gonderılmıyor yanı ornegın

Kod: Tümünü seç

cmdxcx('adb shell su -c "data/local/tmp/firewater"');
cmdxcx('firewater Yes"');

tarzında olmuyor cunku foksiyon bir komut bıtınce orayı komple ıptal edıyor...
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: dos komutunda sorun

Mesaj gönderen ertank »

Acaba firewater uygulamasında "soru sormadan evet olarak kabul et" gibi bir parametre yok mu? En kolay yöntem bu olacaktır. Bunun dışında aşağıdaki sonuçlar çıktı internette.

http://mc-computing.com/languages/DOSSendKeys.htm

http://www.delphigroups.info/2/9d/492744.html
Bu ikinci seçenek için önce çalışan MS-DOS penceresinin Handle bilgisini FindWindow() ile bulmak, sonra aktif pencere yapmak ardından verilen örnek kodu kullanmak gerekiyor.

Aktif pencere yapmak için aşağıdaki kodu kullanabilirsin diye ümit ediyorum. Windows 95/98 üzerinde çalıştığını belirtmişler.

Kod: Tümünü seç

function ForceForegroundWindow(Const hWnd: THandle): Boolean;
var
  hCurWnd: THandle;
begin

 Result := False;

 if not isWindow(hWnd) then Exit;
 hCurWnd := GetForegroundWindow;

 if (hCurWnd=hWnd) then begin
   Result := True;
   Exit;
 end;

 if (GetWindowLong( hWnd, GWL_STYLE ) and WS_MINIMIZE)<>0 then 
   ShowWindow(hWnd, SW_SHOWNOACTIVATE);

 AttachThreadInput(GetWindowThreadProcessId(hCurWnd,
nil),GetCurrentThreadId,True);

 Application.ProcessMessages; // !!!

 SetForegroundWindow(hWnd);

 AttachThreadInput(    GetWindowThreadProcessId(hCurWnd,
nil),GetCurrentThreadId, False);

 Result := GetForegroundWindow=hWnd;

end;
seci20

Re: dos komutunda sorun

Mesaj gönderen seci20 »

ertank yazdı:Acaba firewater uygulamasında "soru sormadan evet olarak kabul et" gibi bir parametre yok mu? En kolay yöntem bu olacaktır. Bunun dışında aşağıdaki sonuçlar çıktı internette.

http://mc-computing.com/languages/DOSSendKeys.htm

http://www.delphigroups.info/2/9d/492744.html
Bu ikinci seçenek için önce çalışan MS-DOS penceresinin Handle bilgisini FindWindow() ile bulmak, sonra aktif pencere yapmak ardından verilen örnek kodu kullanmak gerekiyor.

Aktif pencere yapmak için aşağıdaki kodu kullanabilirsin diye ümit ediyorum. Windows 95/98 üzerinde çalıştığını belirtmişler.

Kod: Tümünü seç

function ForceForegroundWindow(Const hWnd: THandle): Boolean;
var
  hCurWnd: THandle;
begin

 Result := False;

 if not isWindow(hWnd) then Exit;
 hCurWnd := GetForegroundWindow;

 if (hCurWnd=hWnd) then begin
   Result := True;
   Exit;
 end;

 if (GetWindowLong( hWnd, GWL_STYLE ) and WS_MINIMIZE)<>0 then 
   ShowWindow(hWnd, SW_SHOWNOACTIVATE);

 AttachThreadInput(GetWindowThreadProcessId(hCurWnd,
nil),GetCurrentThreadId,True);

 Application.ProcessMessages; // !!!

 SetForegroundWindow(hWnd);

 AttachThreadInput(    GetWindowThreadProcessId(hCurWnd,
nil),GetCurrentThreadId, False);

 Result := GetForegroundWindow=hWnd;

end;
hocam cevap verdıgınız ıcın cok tesekkur ederım bu bır tek o uygulama ıcın gecerlı degıl daha kullandıgım bır cok uygulama var o sadece bır tanesı dedıklerınızı deneyıp buraya sonuc yazacagım cok tesekkur ederım ALLAH razı olsun
Cevapla