Avatar billede cr2000 Nybegynder
18. august 2004 - 13:52 Der er 14 kommentarer og
1 løsning

Grappe fejl. Ligesom en debugger

Hej gutter og eventuelle gutinder....

Kan det på nogen måde lade sig gøre at "holde øje" med et program og gemme de fejl der måtte ske?

Jeg skal nemlig lave en watchdog som skal holde øje med at et andet program kører.
Hvis der opstår en fejl skal watchdog sende fejlen til en server via internettet og så genstarte programmet.

Er det noget der kan laves?
Avatar billede borrisholt Novice
18. august 2004 - 14:32 #1
Du skal købe Dmitriy Gremyakov's ExceptionalMagic. Jeg har desvære ikke en download adresse til ham, til trods for jeg har en lovlig licens. Den her virker ikke mere : http://dimus.virtualave.net

Men ExceptionalMagic fanger ALLE exceptions i dit program og logger dem. Du kan selv overstyre den måde som fejlen bliver logget på.

Jens B
Avatar billede borrisholt Novice
18. august 2004 - 14:34 #2
Jeg fandt et link :
http://dimusware.com/delphi/excmagic/

Jens B
Avatar billede cr2000 Nybegynder
18. august 2004 - 15:12 #3
Hmm... Det var nu meningen at jeg ville lave det selv... Derfor jeg har lagt det i Delphi katagorien...
Avatar billede borrisholt Novice
18. august 2004 - 15:41 #4
Så skal du kigge på Exception Hook. Slå det op i MSDN under SetWindowHookEx.

Jeg troede du skulle bruge det til en prof. Applikation. ExceptionalMagic er i øvrigt med fuld kilde kode ;)

Jens B
Avatar billede cr2000 Nybegynder
18. august 2004 - 16:23 #5
Uha jeg er blank... Hvis der er nogle der kan kickstarte mig lidt vil jeg blive happy :)
Avatar billede cr2000 Nybegynder
18. august 2004 - 16:24 #6
Om ikke andet...til at starte med vil jeg gerne tjekke om programmet overhovet kører
Avatar billede borrisholt Novice
19. august 2004 - 07:14 #7
Du kan starte med at sætte en TApplikation komponent på din form. Og så bruge dens OnException til at fange fejl med.

Jens B
Avatar billede cr2000 Nybegynder
19. august 2004 - 09:04 #8
øhm?... Jeg vil jo ikke fange fejlene i watchdog'en...
Avatar billede borrisholt Novice
19. august 2004 - 09:16 #9
Nu ved jeg ikke lige hvad en watchdog er. Men du kan ikke fange Exception i en fremmed Applikation, kun internt "i dig selv" ellers slå Debug Hook op i MSDN, ikke Exception Hook som  jeg skrev før. Jeg huskede forkert.

Jens B
Avatar billede jonat Nybegynder
21. august 2004 - 09:34 #10
Lige koden til om et program kører:

Function EnumProc( hw: HWND; Var data: TEnumData ): Bool; stdcall;
  Var
    pID: DWORD;
  Begin
    Result := True;
    If (GetWindowLong(hw, GWL_HWNDPARENT) = 0) and
      (IsWindowVisible( hw ) or IsIconic(hw))
    Then Begin
      GetWindowThreadProcessID( hw, @pID );
      If pID = data.pID Then Begin
        data.hW := hW;
        Result := False;
      End; { If }
    End; { If }
  End; { EnumProc }

Function WindowFromProcessID( pID: DWORD ): HWND;
  Var
    data: TEnumData;
  Begin
    data.pID := pID;
    data.hW := 0;
    EnumWindows( @EnumProc, longint(@data) );
    Result := data.hW;
  End; { WindowFromProcessID }

Function WindowFromAppname32( appname: String ): HWND;
  { Take only the application filename, not full path!
    Need to pass the extension as well. }
  Var
    snapshot: THandle;
    processEntry : TProcessEntry32;
  Begin
    Result := 0;
    snapshot := CreateToolhelp32Snapshot(
                  TH32CS_SNAPPROCESS,
                  0 );
    If snapshot <> 0 Then
    try
      processEntry.dwSize := Sizeof( processEntry );
      If Process32First( snapshot, processEntry ) Then
      Repeat
        If AnsiCompareText(
            appname,
            ExtractFilename( StrPas(processEntry.szExeFile))
            ) = 0
        Then Begin
          Result:= WindowFromProcessID( processEntry.th32ProcessID);
          Break;
        End; { If }
      Until not Process32Next( snapshot, processEntry );
    finally
      CloseHandle( snapshot );
    End; { try }
  End; { WindowFromAppname32 }


procedure TForm1.Button1Click(Sender: TObject);
begin
if WindowFromAppname32('Winword.exe') <> 0 then // Kald proceduren til at chekke
ShowMessage('Programmet kører');                // Om programmet kører.
end;

// Jonat.
Avatar billede jonat Nybegynder
21. august 2004 - 09:35 #11
og så skal denne type være dekleret:

type
  TEnumData = Record
    hW: HWND;
    pID: DWORD;
  End;

Den glemte jeg lige ;)

// Jonat.
Avatar billede cr2000 Nybegynder
21. august 2004 - 12:08 #12
Blæret tak :D
Avatar billede cr2000 Nybegynder
27. december 2005 - 12:53 #13
Syntes jonat skulle kaste et svar her. Så kan jeg lukke tråden. :)
Avatar billede jonat Nybegynder
28. december 2005 - 22:57 #14
Svar :)

Forresten... Den fejlgrapper jeg bruger hedder EurekaLog ....

Se : www.EurekaLog.com ... Den tager også alle fejl, og flere til :)

Den kan også købes for en plovmand, hvilket jeg synes er ok, da den er utrolig effektiv og med indygget mail funktion m.m.

// Jonat.
Avatar billede cr2000 Nybegynder
29. december 2005 - 09:40 #15
Jeg arbejder ikke i delphi mere. Og har implementeret logging af exceptions i .NET hvilke jeg syntes funker rimeligt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester