Prozess-ID herausfinden

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Prozess-ID herausfinden

Beitrag von Chris »

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
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Chris,
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

Gruß Manfred
Antworten