dostan geri bilgi döndürmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

dostan geri bilgi döndürmek

Mesaj gönderen EeCOMP »

s.a
ben projemde bir bat dosyasının içine dosta çalıştırmak için bir takım kodlar yazıyorum sonra

Kod: Tümünü seç


shellexecute(0,'open','c:\MOyedekleme\yedek.bat','','',sw_show);
komutu ile o bat dosyasını çalıştırıyorum.fakat programımda bat dosyasını çalıştırdıktan sonra bir takım kodlar daha çalıştırıyorum tabi böyle olunca program dosta komutları çalıştırırken benim diğer kodlarıda çalıştırıyo buda programı çok yavaşlattı ben bu komutu yazdıktan sonra dostaki iş bitene kadar programın beklemesini bittikten sonra diğer kodlarımı çalıştırmak istiyorum bunu nasıl yapabilirim.ben bat dosyasını çalıştırdıktan sonra bu komutların bitip bitmediğini bitti ise olumlumu bitti yoksa dosta hatamı verdi öğrenmek istiyorum bunu nasıl yapabilirim yardımcı olursanız sevinirim.
s.a
Kainat dahi bir programdır ve şüphesiz onun bir programcısı vardır...
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Mesaj gönderen EeCOMP »

aslında ben tüm komutlarımı en başa yazarım butonun en sonuna bat dosyasını çalıştıran kodu yazarım batın işini bitirip bitirmediğini öğrenmeme gerek yok o sorun olmaz ama dosa yazdığım komutların olumlumu olumsuzmu sonuçlandığını hata verdiyse haberim olması gerek bunu nasıl yapabilirim ?
Kainat dahi bir programdır ve şüphesiz onun bir programcısı vardır...
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Çalıştırıdığın dıs komutları nedir bilmiyorum ama dos komutlarının sonuna >dosya.adi yazarsan, ekrana vermesi gereken bilgiyi bu dosyaya yazar.
Hatayı yazar mı bilmem? Ancak bacth komutların bittiğini anlamak için şöyle birşey yapabilirsin. bat dosyasının son satırını dir >bitti.txt olarak değiştirirsin.

Kod: Tümünü seç

    
    Cursor := crHourGlass;
    repeat
        Application.ProcessMessages;
    until FileExists('d:\bitti.txt');
    DeleteFile('d:\bitti.txt');
    Cursor := crDefault;
    ShowMessage('Bitti');
Böylece program bitti.txt oluşana kadar bekler.

Kolay Gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Mesaj gönderen EeCOMP »

haklısınız hata ettim kodları tam yazmam gerekirdi
bat dosyasının içeriği şöyle

Kod: Tümünü seç

sl:=tstringlist.create;
sl.add('cd \mysql\bin');
sl.add('mysqldump.exe -u root -proot  --databases veritabanı >yedek.txt');
sl.add('del c:\yedekleme\yedek.bat');
sl.savetofile('c:\yedekleme\yedek.bat');
söylediğinizi zaten ben yapıyorum battaki mysqldump komutu görüntüyü yedek.txt içine yazıyo zaten bir sorun çıkmadığı zamanda yedek.txt oluşana kadar bekliyo
komuttan sonrada o bat dosyasını sildiriyorum

fakat mesela kullanıcı adı veya şifre tutmadığında vs. bir hata oluştuğu zaman dosta hata veriyo fakat ben bu hatayı delphide algılayamıyorum.dosta verilen hata mesajını delphide showmessage ile felan gösterebilirsem çok iyi olur
bu konuda bana yardımcı olabilirseniz çok sevinirim
iyi çalışmalar
Kainat dahi bir programdır ve şüphesiz onun bir programcısı vardır...
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Master_Yoda
Üye
Mesajlar: 35
Kayıt: 13 Ara 2005 12:57

Mesaj gönderen Master_Yoda »

shellexecuteEx ile daha esnek bir çalıştırma yapabilirsin.
Bu şekilde oluşturulan processin handle 'i alınabilir ve waitforsingleobject
ile bitmesi beklenebilir.

Kod: Tümünü seç


Function MyExec(c_FileName,c_Params:String;l_wait:Boolean):Integer; 
var
  ei: TSHELLEXECUTEINFO;
begin
  ei.cbSize := SizeOf(ei);
  ei.Wnd    := Application.Handle;
  ei.lpVerb := 'OPEN';
  ei.lpFile := pchar(c_filename);
  ei.lpParameters := pchar(c_params);
  ei.lpDirectory := '';
  ei.fMask  := SEE_MASK_NOCLOSEPROCESS;
  ShellExecuteEx( @ei);
  Result := ei.hInstApp;
  if Result <= 32     // hata var
  then Raise Exception.Create('Error ('+inttostr(Result)+') on Execute:'+c_FileName+' '+c_params); 
  else if l_wait then
    WaitForSingleObject(ei.hProcess, INFINITE);
end;
 

Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

.bat dosyalarda hata kontrolu ve çalışan komut/programın doğru sonlanım sonlanmadığını çalışan programın içinden errorlevel diye bir değişkeni set ederek öğrenebilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
MuKaN®
Üye
Mesajlar: 7
Kayıt: 01 Ara 2005 06:45
Konum: DPÜ

Mesaj gönderen MuKaN® »

bat dosyasının içindeki komutun sonuna boşluk bırakarak >dosya yolu yazarsan bilgiler dosyaya yazılır.sende bu dosyadan import edebilirsin.gerçi söyleyen arkadaşlar olmuş ama tekrardan zara gelmez. dir c: > c:\deneme.txt gibi.ee ne demişler et-tekrarü ahsen velevkene yüzseksen :lol:
Şeytan Bunun Neresinde?
Kullanıcı avatarı
coskundeniz
Üye
Mesajlar: 22
Kayıt: 20 Ara 2003 11:36

Mesaj gönderen coskundeniz »

Merhabalar

Eğer çalıştırdığın dos uyglamaların ekran çıktılarını almak istersen aşağıdaki kodu deneyebilirsin. Ben bu kodu bu sitedeki bir yazıdan almıştım ama deneme fırsatım olmadı.

Kod: Tümünü seç

procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
const
  ReadBuffer = 2400;
var
  Security : TSecurityAttributes;
  ReadPipe,WritePipe : THandle;
  start : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  Buffer : Pchar;
  BytesRead : DWord;
  Apprunning : DWord;
begin
  With Security do
  begin
    nlength := SizeOf(TSecurityAttributes) ;
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  if Createpipe (ReadPipe, WritePipe, @Security, 0) then
  begin
    Buffer := AllocMem(ReadBuffer + 1) ;
    FillChar(Start,Sizeof(Start),#0) ;
    start.cb := SizeOf(start) ;
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
    start.dwFlags := STARTF_USESTDHANDLES +
    STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;

    if CreateProcess(nil, PChar(DosApp),
                    @Security,
                    @Security,
                    true,
                    NORMAL_PRIORITY_CLASS,
                    nil,
                    nil,
                    start,
                    ProcessInfo) then
    begin
      repeat
        Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100) ;
        Application.ProcessMessages;
      until (Apprunning <> WAIT_TIMEOUT) ;
      Repeat
        BytesRead := 0;
        ReadFile(ReadPipe,Buffer[0],
        ReadBuffer,BytesRead,nil) ;
        Buffer[BytesRead]:= #0;
        OemToAnsi(Buffer,Buffer) ;
        AMemo.Text := AMemo.text + String(Buffer) ;
      until (BytesRead < ReadBuffer) ;
    end;
    FreeMem(Buffer) ;
    CloseHandle(ProcessInfo.hProcess) ;
    CloseHandle(ProcessInfo.hThread) ;
    CloseHandle(ReadPipe) ;
    CloseHandle(WritePipe) ;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject) ;
begin {button 1 code}
  RunDosInMemo('chkdsk.exe c:\',Memo1) ;
end;


Ayrıca aşağıdaki kod ile dos uygulamalarını çalıştırırken, değişik alternatiflerle çalıştırabilirsin



Umarım işini görür

Kod: Tümünü seç

function ExecFileAndWait(const aCmdLine: String; Hidden, doWait: Boolean): Boolean; 
var 
   StartupInfo : TStartupInfo; 
   ProcessInfo : TProcessInformation; 
begin 
// setup the startup information for the application
 
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0); 
   with StartupInfo do 
    begin 
     cb:= SizeOf(TStartupInfo);
     dwFlags:= STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; 
     if Hidden 
      then wShowWindow:= SW_HIDE 
      else wShowWindow:= SW_SHOWNORMAL; 
    end; 

    Result := CreateProcess(nil,PChar(aCmdLine), nil, nil, False, 
    NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); 
    if doWait then 
      if Result then 
      begin 
        WaitForInputIdle(ProcessInfo.hProcess, INFINITE); 
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
      end else Raise Exception.Create('Interbase Klasörü Bulunamadı');
end; 
ExecFileAndWait('uygulama', True, True);

Hidden = True ise dos uylamasının görüntüsü yok olur
doWait = True ise uygulama bitene kadar bekler
Cevapla