title image


Smiley Laufende Prozesse herausfinden - So gehts unter NT
Hallo.Nachdem schon zwei Beiträge über dieses Problem im Forum stehen und ich vor kurzem selbst vor diesem Problem stand, schreibe ich hier mal meine Lösung für NT.Das ist schon einmal der erste "Klops"; das funktioniert nämlich unter NT anders als unter Win95/98! (Habe ich mich schon einmal über die Konsistenz bei Microsoft geäußert ? :-)Unter NT braucht man dazu die PSAPI.DLL. Sie enthält Funktionen um Prozesse aufzulisten, die benutzten Module aufzulisten, den Pfad eines Modules herauszubekommen und den Namen des Modules herauszufinden.Zuerst ruft man die Funktion EnumProcesses auf. Sie erwartet als einen ihrer Parameter ein Array aus Longs. Sie trägt dort alle "ProcessIdentifier" (PID) der gerade laufenden Prozesse ein.Mit diesen PIDs kann man sich nun mit der Funktion OpenProcess (in Kernel32) einen Handel auf den Prozess holen (Nicht vergessen den Handel via CloseHandle zu schließen!).Mit diesem Handle ruft man nun die Funktion EnumModuleHandles auf. Sie erwartet ebenso wie EnumProcesses ein Array aus Longs als einen ihrer Parameter. Dort trägt sie die Handels der Module ein die in diesem Prozess geladen wurden. Der erste Handel ist immer der der Anwendung!Erst jetzt ist man soweit den Namen der Anwendung herauszubekommen. Um den kompletten Pfad herauszufinden ruft man die Funktion GetModuleFileNameEx auf. Sie erwartet als einen ihrer Parameter einen String der Form Dim S As String * 600. In diesen String wird der Pfad kopiert.Will man nur den Modulnamen haben kommt die Funktion GetModuleBaseName zu Einsatz. Die Aufruf- und Rückgabewerte sind mit GetModuleFileNameEx identisch.Jetzt hat man den Namen der Anwendung herausgefunden - unter NT!In Win95/98 braucht man dazu die Funktionen aus dem Bereich ToolHelp32 der Kernel32.dll. Ich bin gerade erst bei CreateToolhelp32Snapshot angelangt. Desswegen kann ich zur weiteren Vorgehensweise noch keine Angaben machen.Hier liste ich jetzt die VB-Deklarationen auf die in NT40 nötig sind:Public Declare Function EnumProcesses Lib "psapi" _    (lpidProcess As Long, _    ByVal cb As Long, _    lpcbNeeded As Long) As BooleanPublic Declare Function EnumProcessModules Lib "psapi" _    (ByVal hProcess As Long, _    lphModule As Long, _    ByVal cb As Long, _    lpcbNeeded As Long) As BooleanPublic Declare Function GetModuleFileNameEx Lib "psapi" _    Alias "GetModuleFileNameExA" _    (ByVal hProcess As Long, _    ByVal hModule As Long, _    ByVal lpFileName As String, _    ByVal nSize As Long) As LongPublic Declare Function GetModuleBaseName Lib "psapi" _    Alias "GetModuleBaseNameA" _    (ByVal hProcess As Long, _    ByVal hModule As Long, _    ByVal lpBaseName As String, _    ByVal nSize As Long) As LongWeitere und sicherlich genauere Informationen findet Ihr in der MSDN-Hilfe.Bleibt noch zu sagen das es in VB möglich ist die Adresse eines Arrays an eine API-Funktion zu übergeben. Ist ein Array wie folgt definiert Dim Processes() As Long, kann man es folgendermaßen übergeben:..., Processes(0), ...Das sieht zwar etwas komisch aus, aber es funktioniert. VB macht anscheinend den Rest.Viel Spaß beim "basteln" wünschtJörn Olfermann

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: