Çalışan Bir Programı Sorgulamak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
akissoftware
Üye
Mesajlar: 118
Kayıt: 17 Ağu 2010 09:08

Çalışan Bir Programı Sorgulamak

Mesaj gönderen akissoftware »

Merhaba arkadaşlar.

Bir program yazmak istiyorum. Bu program o an çalışan bir programı belirli aralıklarla kontrol edecek çalışıp çalışmadığını. Eğer kontrol ettiğim program bir sebepten dolayı kapanırsa bir alarm üretmek istiyorum. Bunu nasıl yapabilirim ? Bir çok site araştırdım ama istediğim gibi bir kod bulamadım. Yardımlarınız için teşekkürler
akissoftware
Üye
Mesajlar: 118
Kayıt: 17 Ağu 2010 09:08

Re: Çalışan Bir Programı Sorgulamak

Mesaj gönderen akissoftware »

İnceledim ama tam olarak istediğim gibi değil. Farklı sitelerde de arıyorum fakat bulamadım henüz
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Çalışan Bir Programı Sorgulamak

Mesaj gönderen xxxjedixxx »

Merhaba,

Aşağıdaki örnek işinizi görecektir. Fakat, bu kod ile yazdığınız program 32bit ise 64bitlik uygulamaları kontrol edemezsiniz. Bu yüzden 64bit derleyiciniz varsa programınızı 64bit olarak derleyin.

Kod: Tümünü seç

uses'a PsApi'yi ekleyin. (XE sürümleri için Winapi.Psapi)

type
  TEnumProcData = record
    ProcessId: THandle;
    FileName: string;
  end;
  TEnumProcessData = array of TEnumProcData;

implementation

function EnumAllProcessesWithPath(var ProcData: TEnumProcessData): Integer; safecall;
var eapResCnt, eapHProc, eapHMod, eapNeeded: DWord;
    eapProcs: array [0..1023] of DWord;
    eapFileName: array [0..1023] of Char;
    eapCnt, eapCount: Integer;
begin
  Result := 0;
  if EnumProcesses(@eapProcs, Length(eapProcs), eapResCnt) then
  begin
    eapResCnt := eapResCnt div SizeOf(DWord); eapCount := 0;
    for eapCnt := 0 to eapResCnt - 1 do
    begin
      eapHProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, eapProcs[eapCnt]);
      if eapHProc > 0 then
      begin
        if EnumProcessModules(eapHProc, @eapHMod, SizeOf(eapHMod), eapNeeded) then
        begin
          GetModuleFileNameEx(eapHProc, eapHMod, eapFileName, SizeOf(eapFileName));
          Inc(eapCount);
          SetLength(ProcData, eapCount);
          ProcData[eapCount - 1].ProcessId := eapProcs[eapCnt];
          ProcData[eapCount - 1].FileName := eapFileName;
        end;
        CloseHandle(eapHProc);
      end;
    end;
    Result := eapCount;
  end;
end;

function IsProcessRunning(pFilePath: string): Boolean;
var AllProcess: TEnumProcessData;
    i, ProcCount: Integer;
    SrcFilePath: string;
begin
  Result := False;
  SetLength(AllProcess, 0);
  ProcCount := EnumAllProcessesWithPath(AllProcess);
  SrcFilePath := AnsiLowerCase(pFilePath);
  for i := 0 to ProcCount - 1 do
  if AnsiLowerCase(AllProcess[i].FileName) = SrcFilePath then
  begin
    Result := True;
    Break;
  end;
end;

// bu kısım örnek olsun diye, 32 ve 64 bit notepad.exe'nin çalışıp çalışmadığının kontrolü için
procedure TForm1.Button1Click(Sender: TObject);
begin
  If IsProcessRunning('C:\Windows\System32\Notepad.exe') then // 64bit olan
    Edit1.Text := 'Notepad64 çalışıyor.' 
  else 
    Edit1.Text := 'Notepad64 Çalışmıyor.';
  
  If IsProcessRunning('C:\Windows\Syswow64\Notepad.exe') then // 32 bit olan
    Edit2.Text := 'Notepad32 çalışıyor.' 
  else 
    Edit2.Text := 'Notepad32 Çalışmıyor.' ;
end;

Cevapla