Hallo,
ich starte über meine Anwendung externe Programme per ActiveX und benötige nun für die laufende Instanz des Programmes die Prozess-ID.
Muss das Programm am Ende auch immer wieder beenden. Nur wenn ich das direkt über die Kill.exe mache, dann beendet er mir leider alle Instanzen, auch die die ich nicht gestartet habe, das ist nicht gerade so hilfreich
Weiss vielleicht jemand wie ich recht einfach und schnell an die ID rankomme?
Danke schon mal.
Gruß,
Chris
Prozess-ID herausfinden
Moderator: Moderatoren
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Moin Chris,
unter diesem Thread innerhalb dieses Forums solltest Du eine Lösung zu Deinem Problem finden:
http://www.xbaseforum.de/viewtopic.php?t=147&highlight=
Gruß, Olaf
unter diesem Thread innerhalb dieses Forums solltest Du eine Lösung zu Deinem Problem finden:
http://www.xbaseforum.de/viewtopic.php?t=147&highlight=
Gruß, Olaf
-
- Cut&Paste-Entwickler
- Beiträge: 37
- Registriert: Do, 19. Okt 2006 10:24
- Wohnort: St. Martin
Hallo Chris,
Deine Frage ist zwar schon ein paar Wochen her, aber vielleicht kannst Du mit dem Folgende Code doch noch etwas anfangen.
Gruß Manfred
Deine Frage ist zwar schon ein paar Wochen her, aber vielleicht kannst Du mit dem Folgende Code doch noch etwas anfangen.
Code: Alles auswählen
DLLFUNCTION EnumProcesses(@lpidProcess,cb,@cbNeeded) USING STDCALL FROM PSAPI.DLL
DLLFUNCTION OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId) USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION EnumProcessModules(hProcess,@lphModule,cb,@lpcbNeeded) USING STDCALL FROM PSAPI.DLL
DLLFUNCTION GetModuleBaseNameA(hProcess,hModule,@lpBaseName,nSize) USING STDCALL FROM PSAPI.DLL
#DEFINE PROCESS_QUERY_INFORMATION 1024
#DEFINE PROCESS_VM_READ 16
#define STANDARD_RIGHTS_REQUIRED (0x000F0000)
#define SYNCHRONIZE (0x00100000)
#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
#define PROCESS_TERMINATE (0x0001)
Function KillExeProcess(cExe,nPidDel)
LOCAL aProcesses,cbNeeded,nPid
local nProcHandle
LOCAL aModules,cbNeeded2
local n,nMax
LOCAL process,hmod
local cname,nH
local xRet
aprocesses := space(10240)
cbNeeded := 0
aModules := space(4*10)
cbNeeded2 := 0
cname := space(64)
EnumProcesses( @aProcesses, LEN(aProcesses) , @cbNeeded )
//? "Anzahl Prozesse",len(trim(aProcesses))/4,cbNeeded
//msgbox("wait...")
nMax := len(trim(aProcesses))/4
for n:= 1 to nMax
nPid := Bin2U(substr(aProcesses,1+((n-1)*4),4))
if nPidDel==NIL .or. (nPIdDel==nPid)
nProcHandle := OpenProcess( PROCESS_QUERY_INFORMATION + PROCESS_VM_READ ,0, nPid )
if EnumProcessModules( nProcHandle, @aModules,len(aModules)/4, @cbNeeded2) != 0
cName := space(128)
xRet := GetModuleBaseNameA( nProcHandle,bin2u(substr(aModules,1,4)),@cName,len(cName))
cName := strtran(cname,chr(0),"")
CloseHandle(nProcHandle)
//? "Prozess",n,nPid,nProcHandle,"Enum",len(trim(amodules)),cbNeeded2,len(ltrim(trim(cName))),ltrim(trim(cName)),cExe
if upper(trim(cName))==upper(cExe)
nProcHandle := OpenProcess(1,0,nPId)
? "Bende Prozess",cExe
TerminateProcess(nProcHandle,1)
CloseHandle(nProcHandle)
//msgbox("wait...")
endif
endif
endif
next n
//msgbox("wait...")
RETURN NIL