Windows Prozessliste unter XBase

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Windows Prozessliste unter XBase

Beitrag von andreas »

Hallo Leute,

hat schon jemand unter XBase die Windows Prozessliste am besten per Remote ausgelesen. Ich möchte ein Programm haben bzw. schreiben, womit ich auf einem Server Dienste überwachen und Warnung bei Absturz rausgeben kann.
Ich habe versucht, unter API was zu finden, was aber nicht so einfach ist.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Andreas.

Schau Dir mal die ServiceController-Klasse von Xbase an (ab 1.8 ).
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Tom,

ich habe die Klasse angesehen und ausprobiert. Ich bekomme nur Liste mit den Diensten. Die laufende Programme werden nicht angezeigt.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
andreas hat geschrieben: ich habe die Klasse angesehen und ausprobiert. Ich bekomme nur Liste mit den Diensten. Die laufende Programme werden nicht angezeigt.
wir wäre es mit

Code: Alles auswählen

#include "DLL.ch"

#define GW_HWNDFIRST        0
#define GW_HWNDLAST         1
#define GW_HWNDNEXT         2
#define GW_HWNDPREV         3
#define GW_OWNER            4
#define GW_CHILD            5
#define GW_MAX              5

/*
 * ShowWindow() Commands, from WINUSER.H
 */
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_MAX              10

DLLFUNCTION ShowWindow( nHwnd, nCmdShow )       USING STDCALL FROM USER32.DLL
DLLFUNCTION BringWindowToTop( nHwnd )           USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd )        USING STDCALL FROM USER32.DLL

******************
function isAppRun( cNaam )
******************
LOCAL nEvent, mp1, mp2
LOCAL oDlg
local aTasklist
local aSize   := {0,0}
local aPos    := {0,0}
LOCAL lRunnin := .F.
LOCAL i
LOCAL nHwnd

oDlg := XbpDialog():new( AppDesktop(), , aPos, aSize, , .F.)
oDlg:clipSiblings := .T.
oDlg:drawingArea:ClipChildren := .T.
oDlg:create()

setappfocus(oDlg)

aTasklist := GetTaskList( oDlg:gethWnd( ) )

For i = 1 to Len( aTasklist )
    cWind := TRIM( UPPER( Substr( aTasklist[i], 9 ) ) )
    cWind := Substr( cWind, 1, Len( cWind ) - 1 )
    If cWind == Trim( Upper( cNaam ) )
       lRunnin := .T.
*       nHwnd := Val( Left( aTasklist[i], 8 ) )
*       ShowWindow( nHwnd, SW_RESTORE )
*       BringWindowToTop( nHwnd )
*       SetForegroundWindow( nHwnd )

       Return lRunnin
    EndIf
Next

Return lRunnin

******************
function gettasklist( hWnd )
******************
local aList:={}
local cWindowName
local nVisible
while hWnd != 0
   cWindowname := space(100)
   if ( getwindowtexta( hWnd, @cWindowName, len( cWindowName ) ) <> 0 )
       nVisible := IsWindowVisible(hWnd)
       if nVisible == 1
          aadd( aList, Str( hWnd, 8 ) + cWindowname )
       endif
   endif
   hWnd = GetWindow( hWnd, GW_HWNDNEXT )
end
return aList

******************
FUNCTION GetWindow( hWnd, uCmd )
******************
LOCAL nDll:=DllLoad("USER32.DLL")
LOCAL xRet:=DllCall(nDll,DLL_STDCALL,"GetWindow", hWnd,uCmd)
DllUnLoad(nDll)
RETURN xRet

******************
FUNCTION GetWindowTextA( hWnd, lPstring, nMax )
******************
LOCAL nDll:=DllLoad("USER32.DLL")
LOCAL xRet:=DllCall( nDll, DLL_STDCALL, "GetWindowTextA", hWnd, @lPstring, nMax )
DllUnLoad(nDll)
RETURN xRet

******************
FUNCTION IsWindowVisible( hWnd)
******************
LOCAL nDll:=DllLoad("USER32.DLL")
LOCAL xRet:=DllCall(nDll,DLL_STDCALL,"IsWindowVisible", hWnd)
DllUnLoad(nDll)
RETURN xRet
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Vorsicht!
Die ServiceController-Klasse ist nicht dazu geeignet, den "echten" Status von Prozessen abzufragen, da diese nicht unbedingt korrekt zurückgegeben werden (laut Aussage in der Hilfedatei)!
Man kann also nicht mit dieser Klasse andere Dienste überwachen!
Darum mache ich das bei mir auch um fünf Ecken:
Mein Dienst erzeugt eine Datei und hält sie offen.
Ein zweiter Dienst löscht diese Datei - wenn es ihm gelingt, muss der erste Dienst runtergefallen sein und wird wieder durch den zweiten Dienst angestartet.
Dies könnte man aber auch über Sockets schaffen, über die die beiden Dienste miteinander kommunizieren - schaut mal dazu auf Phil Ides Seite - dort hat er einige Utilities für Socket-Kommunikation liegen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Martin hat recht. Man kann über die ServiceController-Klasse höchstens herausbekommen, was für Dienste laufen und wie ihre Startparameter aussehen, aber echte Kontrolle hat man nur über eigene Dienste. Die sollten sich gefälligst selbst ordnungsgemäß überwachen; es hilft aber, es wie im "SimpleService"-Sample von Alaska zu machen, nämlich ein Programm zu schreiben, daß den Dienst startet und auch überwacht.

Jimmys Code liefert nur die gestarteten "normalen" Programme zurück.
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,

dein Beispiel ist schon das richtige. Gibts es vielleicht noch die Möglichkeit, die Prozessliste Remote von einem anderen PC abzufrage, ohne ein Programm auf dem Remote-PC zu installieren. Sonst muss ich ja ein Server-/Client-Programm schreiben, um die Programme zu überwachen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

moin,
andreas hat geschrieben: dein Beispiel ist schon das richtige. Gibts es vielleicht noch die Möglichkeit, die Prozessliste Remote von einem anderen PC abzufrage, ohne ein Programm auf dem Remote-PC zu installieren. Sonst muss ich ja ein Server-/Client-Programm schreiben, um die Programme zu überwachen.
hm ... gibt es den diese Möglichkeit grundsätzlich (per remote) ?

aber vielleicht kann man von einem anderen Ansatz ausgehen :
wenn dein Programm "hängt" nimmt es dann 100% CPU ?

wenn ja, es gibt doch die Möglichkeit im System Monitor auch per
remote die CPU Auslastung anzuzeigen etc ...
nun kann man SYSMON.OCX leider nicht mit der v1.9x per
ActiveX steuern (irgendwas funktioniert nicht mit IDispatch ...), aber
es gibt da noch PDH (Performance Data Helper).
Durch RegConnectRegistry ist es möglich auch die Performancedaten eines anderen Rechners im Netzwerk abzufragen.
ich hab mal angefangen die VB Functionen nach Xbase++ zu portieren,
aber dann ist wiedermal was "dazwischen" gekommen und nun liegt es
angefangen irgendwo auf der HD rum. Bei Interesse kann ich das was
ich hab ja mal posten.

gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,
ich hab mal angefangen die VB Functionen nach Xbase++ zu portieren,
aber dann ist wiedermal was "dazwischen" gekommen und nun liegt es
angefangen irgendwo auf der HD rum. Bei Interesse kann ich das was
ich hab ja mal posten.
es wäre nicht schlecht wenn du es posten würdest.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Jimmy.

Der PerformanceDataHelper wird offenbar auch von der neuen ASMP10.DLL genutzt, die Alaska mit der 1.9 ausliefert (Samples -> Solution -> CPULOAD) und die neue Funktionalitäten für die Messung von Prozessor-Workloads zur Verfügung stellen soll. Wir haben die neuen Funktionalitäten integriert und große, große Probleme damit, mußten sie letztlich wieder abschalten. Deshalb habe ich mir gerade gestern den PDH angesehen, um zu prüfen, ob ich das nicht mit Hausmitteln machen kann. PDH stellt virtuelle Registry-Werte zur Verfügung, um Daten wie die Prozessorlast abzurufen. Insofern: Wenn Du ohnehin gerade dabei bist - vielleicht können wir gemeinsam etwas erarbeiten.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben: Der PerformanceDataHelper wird offenbar auch von der neuen ASMP10.DLL genutzt, die Alaska mit der 1.9 ausliefert (Samples -> Solution -> CPULOAD)
hab ich nicht ... ist das in der professional Version ?
Insofern: Wenn Du ohnehin gerade dabei bist - vielleicht können wir gemeinsam etwas erarbeiten.
ok ich werde die Sachen mal zusammen suchen und dann posten.

gruss by OHR
Jimmy
Antworten