Diese Aufgabe läßt sich mit der Funktion TerminateProcess() des letzten Postings nicht durchführen, da dort die eigene ProzessID nicht verfügbar gemacht wurde.
Die eigene ProzessID herauszufinden ist in VFP nicht weiter schwierig. Das Applikationsobjekt _VFP stellt sie uns als eine seiner Eigenschaften zu Verfügung (_VFP.ProcessID). Die folgende Beispielfunktion prüft nun vor dem Terminierungsvorgang ab, ob der Zielprozess über die selbe ProzessID verfügt wie die aktuelle Applikation. Ist dies der Fall so wird die Terminierung nicht durchgeführt. Eine weitere Sicherheitsüberprüfung ist, ob der ausführende User auch der 'Eigentümer' der zu löschenden Prozesse ist (Diese Vorgehensweise ist analog zum vorherigen Posting).
* // Funktionstest
RUN /n vfp9.exe
RUN /n vfp9.exe
CLEAR
? [beendete Prozesse:]
?? TerminateOldProcess( [vfp9.exe] )
FUNCTION TerminateOldProcess as Integer
LPARAMETERS vAppname as String
* // Funktion zum Löschen gleichnamiger Prozesse übergebener Programme
* // oder der aktuellen Applikation
* //
* // Parameter Variable Status
* // #1 vAppname optional (default = Aktuelles Programm)
* // Name der Programmdatei
vAppname = EVL( vAppname , PROGRAM() )
* // Deklaration und Belegung benötigter Arbeitsvariablen. Hierbei
* // erfolgt bei den zwei Objekt-Variablen eine direkte Referenzierung
* // auf das WMI-Objekt sowie das Abfrageergebnis
LOCAL liReturn as Integer, llExit as Boolean, ;
lcLogname as String , lcComputer as String, ;
loCIMV2 as Object, loProcCols as Object, lcOwner as String
liReturn = 0
llExit = .F.
lcLogname = ALLTRIM( GETWORDNUM( SYS( 0 ) , 2 , [#] ) )
lcComputer = [.]
TRY
loCIMV2 = GETOBJECT( [winmgmts:{impersonationLevel=impersonate}!\\] + lcComputer + [\root\cimv2] )
loProcCols = loCIMV2.ExecQuery( [select * from Win32_Process where name='] + vAppname + ['] )
CATCH
llExit = .T.
ENDTRY
* // Wenn die Instanziierungen erfolgreich waren, dann
* // kann es jetzt losgehen...
IF !llExit
* // Die gefundenen Prozesse entsorgen
FOR EACH objProcess in loProcCols
* // Sicherstellen, dass nur eigene
* // Prozesse gelöscht werden!
lcOwner = SPACE( 256 )
= objProcess.GetOwner( @lcOwner )
IF lcLogname == lcOwner ;
AND _VFP.ProcessID <> objProcess.ProcessID
liReturn = liReturn + 1
objProcess.Terminate( 0 )
ENDIF
ENDFOR
* // WMI-Objektreferenzen auflösen
loCIMV2 = .NULL.
loProcCols = .NULL.
ENDIF
* // Anzahl der gelöschten Prozesse zurückgeben.
RETURN liReturn
ENDFUNC