Windows Prozessliste unter XBase
Moderator: Moderatoren
- andreas
- 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
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.
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.
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
hi,
gruss by OHR
Jimmy
wir wäre es mitandreas hat geschrieben: ich habe die Klasse angesehen und ausprobiert. Ich bekomme nur Liste mit den Diensten. Die laufende Programme werden nicht angezeigt.
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
Jimmy
- Martin Altmann
- Foren-Administrator
- Beiträge: 16508
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- Tom
- 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:
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.
Jimmys Code liefert nur die gestarteten "normalen" Programme zurück.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
moin,
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).
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
hm ... gibt es den diese Möglichkeit grundsätzlich (per remote) ?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.
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).
ich hab mal angefangen die VB Functionen nach Xbase++ zu portieren,Durch RegConnectRegistry ist es möglich auch die Performancedaten eines anderen Rechners im Netzwerk abzufragen.
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
- Tom
- 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:
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.
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
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
hi,
gruss by OHR
Jimmy
hab ich nicht ... ist das in der professional Version ?Tom hat geschrieben: Der PerformanceDataHelper wird offenbar auch von der neuen ASMP10.DLL genutzt, die Alaska mit der 1.9 ausliefert (Samples -> Solution -> CPULOAD)
ok ich werde die Sachen mal zusammen suchen und dann posten.Insofern: Wenn Du ohnehin gerade dabei bist - vielleicht können wir gemeinsam etwas erarbeiten.
gruss by OHR
Jimmy