Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Test-Programm (https://www.delphipraxis.net/52858-test-programm.html)

TJDD 5. Sep 2005 16:29


Test-Programm
 
Hi waollte mal fragen ob es ein Programm gibt das uz.b alle 5 min testen ob ein anderes programm am laufen ist und falls nicht das Programm starten kann

bsp

es lauft "sol.exe"(dumm ich weis)

das Programm soll dann alle 5 min testen o sol.exe lauft wenn nein soll sol.exe gestarten werde

kann mir das jmd sagen oder vlt sogar geben danke

Chegga 5. Sep 2005 16:34

Re: Test-Programm
 
Hi,

suchst oder willst solch ein Programm machen? :gruebel:

MfG Marc

Mr_G 5. Sep 2005 16:38

Re: Test-Programm
 
Falls du es selber programmieren willst guckst du hier oder suchst mal hiernach: Hier im Forum suchenShellExecute

Sergej 5. Sep 2005 16:38

Re: Test-Programm
 
Also... :roll:


Programm starten

Prüfen ob ein Programm läuft


Und für den Rest reicht ein Timer...


Greetz Sergej

TJDD 8. Sep 2005 20:07

Re: Test-Programm
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, tlhelp32, ShellAPI, ExtCtrls, AppEvnts;

const IC_CLICK = WM_APP + 201;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure Systray(var sMsg: TMessage); message IC_CLICK;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  NIM : TNotifyIconData;

implementation

{$R *.dfm}

var bclose : boolean;

function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  bClose := True;
end;

procedure TForm1.Systray(var sMsg: TMessage);
begin
  inherited;
  if (sMsg.LParam = WM_LBUTTONDOWN) then
    begin
      Show;
      Shell_NotifyIcon(NIM_DELETE, @NIM);
      Application.Restore;
    end;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  Form1.FormStyle:=fsStayOnTop;
  Hide;
  with NIM do
    begin
      cbSize := SizeOf (nIM);
      Wnd := Handle;
      uID := 0;
      uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallbackMessage := IC_CLICK;
      hIcon := Application.Icon.Handle;
      szTip := 'Network';
    end;
    Shell_NotifyIcon(NIM_ADD, @NIM);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin
  bClose := False;
  while bClose = False do
  begin
    hProcess := GetProcessHandleFromID(GetProcessID('notepad.exe'));
    if hProcess = 0 then
       winexec(pchar('notepad.exe'),sw_shownormal)
    else
      label1.caption := 'Bereits offen';
    Application.HandleMessage;
  end;
end;

end.
Erst mal danke an alle die mir Antwort gaben

Habe bei dem obigen Quellcode noch ein Problem wenn ich das Programm satrte wenn es aus war versucht der Timmer das programm immer wieder neu zu öffnen also hab ich nachher zichtausend fenster offen

kann man das irgendwie ausschalten also wenn das Programm laüft mach nix öffnen??

Mr_G 8. Sep 2005 20:57

Re: Test-Programm
 
Zitat:

Zitat von TJDD
...
Erst mal danke an alle die mir Antwort gaben

Habe bei dem obigen Quellcode noch ein Problem wenn ich das Programm satrte wenn es aus war versucht der Timmer das programm immer wieder neu zu öffnen also hab ich nachher zichtausend fenster offen

kann man das irgendwie ausschalten also wenn das Programm laüft mach nix öffnen??

Also in meinen Augen wird bei diesem Code notepad.exe nur einmal ausgeführt, lässt sich logicherweise aber auch nicht mehr schließen...

TJDD 9. Sep 2005 11:09

Re: Test-Programm
 
Also ich kann nicht erkennen wieso er ein Programmm mehrmals öffnet
Weis ich auch net kapiere ist wenn das programm geschlossen wird warum direkt es dirket wieder geöffnet wird also normalerweise dürfte er wes erst nach der zeit wieder öffnen oder kannman das mit mner abfrage machen wenn es schon offen ist dann mache das testen net


kann mir jmd helfen??

Mr_G 9. Sep 2005 11:45

Re: Test-Programm
 
Also ich versteh beim besten willen nicht was du willst!
Der Code den du hast überprüft in einem Interval das du im Timer einstellen kannst ob dein Notepad läuft. Wenn es nicht läuft wird es geöffnet und das ist ja genau das was du wolltest, oder?
Und wenn nicht, was willst du denn dann überhaupt? :gruebel:

TJDD 9. Sep 2005 16:01

Re: Test-Programm
 
Genau das will ich das macht es auch aber wenn es auf ist macht genau dieser Code das Programm nochmal und nochmal und nochmal... auf das will cih nicht ich will wenn das Programm nicht läuft das Program 1 einziges mal starten nicht so oft das Intervall erreicht wird

Beispiel
Inetervall: 5 sec
Programmstatus: aus

So das Programm testet nun nach 5 sec ob notepad läuft (nein)
so nun soll es notepade öffnen (macht es)
5 sec Später
das programm öffnet notepad wieder (es ist aber schon offen)
5 sec Später
das programm öffnet notepad wieder (es ist aber schon 2x offen)
5 sec Später
das programm öffnet notepad wieder (es ist aber schon 3x offen)
....


Dort liegt der Fehler

Mr_G 9. Sep 2005 16:37

Re: Test-Programm
 
Hmm...
Das Programm das ich aus deinem Code nachgebaut habe fuktioniert.
Ich kann mir das nicht recht erklähren. Könnte es sein das der Prozess nicht notepad.exe heißt sondern vielleicht NOTEPAD.EXE? Das ist mir nämlich mal untergekommen.
Ansonsten könntest du einfach mal dein Projekt Anhängen und ich teste es mal bei mir.

TJDD 9. Sep 2005 16:47

Re: Test-Programm
 
der Code ist mein Projekt ich wollte nur dies ereichen ich werde mal genau den Genauen Pfad angeben und auf groß und klien schreibung achten

TJDD 10. Sep 2005 12:09

Re: Test-Programm
 
sry für den Doppelpost wollte das man das aktualisierte besser sieht


Also ich habe mir mal gedanken gemacht und ich denke das Problem ist gelöst

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin
  bClose := False;
  while bClose = False do
  begin
    hProcess := GetProcessHandleFromID(GetProcessID('C:\Programme\TightVNC\WinVNC.exe'));
    if hProcess = 0 then
      begin
        [b]Timer1.enabled := false;[/b]
        winexec(pchar('C:\Programme\TightVNC\WinVNC.exe'),sw_shownormal);
      end
    else
     [b] Timer1.enabled := true;[/b]
    Application.HandleMessage;
  end;
habe mal den Timmer deaktiviert wenn das programm an ist erst wenn es aus ist wird er wieder akriv :hello: :party:

TJDD 12. Sep 2005 11:02

Re: Test-Programm
 
So habe dann noch ne frgae wie bekomme ich das Programm in die Regetry so dass es automatisch bei Windowsstart geladen wird??

Matze 12. Sep 2005 11:06

Re: Test-Programm
 
Siehe: AutostartAutostart

TJDD 12. Sep 2005 20:08

Re: Test-Programm
 
Zitat:

original von Dieser Code stammt von Daniel B.:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
    Reg.WriteString('NameDerAnwendung', ParamStr(0));
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;

Muss nun unter namen der anwendung nur der name oder der komplette pfad

Z.B

Project1.exe

oder

c:\Projekt1.exe

Mr_G 12. Sep 2005 20:35

Re: Test-Programm
 
Soweit ich das sehe ist das nur eine Beschreibung da der Komplette Pfad ja mit ParamStr(0) als Wert eingetragen wird.
Project1.exe würde also reichen.

P.S.: Wie war das noch gleich mit: "Neue Frage - neuer Thread"?

TJDD 12. Sep 2005 22:23

Re: Test-Programm
 
gehört aber noch zu dem obigen Programm daher nix neues wollen aufmachen

Also nur Programmname

DANKE :thumb:

Olli 12. Sep 2005 22:37

Re: Test-Programm
 
Wäre es nicht am einfachsten, wenn dein "Watchdog" auch den überwachten Prozeß direkt startet? Somit wäre ein Handle vorhanden und der Watchdog könnte über eine der Wait*-Funktionen warten. Wenn du das in einer Schleife machst, wird der Prozeß immer wieder neu gestartet.

Abgesehen davon ist WinExec() "deprecated" und deine Timer1-Methode hoch ineffektiv. Aber jedem das seine :roll:

Desweiteren ist die Funktion GetProcessID() abgesehen von der Inkompatibilität zu Windows NT 4 nicht generisch funktionsfähig! Leider ist der Puffer nicht groß genug um beliebige EXE-Namen zu halten. Wenn also ein zu langer Name gesucht wird, so wird er nicht gefunden, weil der Puffer zB schon bei ".e" statt ".exe" aufhört.

TJDD 13. Sep 2005 10:32

Re: Test-Programm
 
Sehr schon das mir das jmd sagt Dsnke dir Olli :cheers:

Kann man das irgendwie verbessern so das es effektiver ist??

Und gibt es eine besser Fucntcion als GetProcessID() ??

Danke für diese gute Hilfe

Olli 13. Sep 2005 11:58

Re: Test-Programm
 
Zitat:

Zitat von TJDD
Kann man das irgendwie verbessern so das es effektiver ist??

Jupp, zB so wie ich das gesagt habe und dann das Ganze in einen Thread auslagern. Da können dir hier andere aber auch weiterhelfen. Ich bin nämlich ab heute Nachmittag bis Freitag nicht verfügbar.

Statt WinExec kannst du dann zB Hier im Forum suchenShellExecuteAndWait (Direktlink) benutzen und in eine Schleife innerhalb eines Threads packen. Dann der Waitfunktion ist das allein schon effektiver, weil eben nicht ein Timer ewig pollt, sondern du quasi benachrichtigt wirst.

Zitat:

Zitat von TJDD
Und gibt es eine besser Fucntcion als GetProcessID() ??

Nein. Mir wäre da nichts bekannt. Auf NT/2000 usw. steckt das Problem bereits in der Native API, auf der die Toolhelp-API aufsetzt. Da kann man wohl bloß pragmatisch herangehen :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz