2016-07-24 21 views
1

Ich benutze das Ctypes-Modul und WinAPI, um den Prozessnamen von PID zu finden. Ich habe this Beispiel in C/C++ geschrieben und es funktioniert bis auf die Tatsache, dass die Größe meiner szExeFile ist 0 für jeden Prozess. Fehle ich etwas bei der Verwendung dieser API?Finding Prozessname von PID

def find_pid_with_name(process_name: str): 
    entry = PROCESSENTRY32() 
    entry.dwSize = sizeof(PROCESSENTRY32) 

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, None) 

    if Process32First(snapshot, byref(entry)) == TRUE: 
     while Process32Next(snapshot, byref(entry)) == TRUE: 
      print(libc.wcslen(entry.szExeFile)) 

    CloseHandle(snapshot) 

Meine Strukturdefinition für PROCESSENTRY32:

MAX_PATH = 260 
class PROCESSENTRY32(Structure): 
    _fields_ = [ 
     ("dwSize", c_ulong), 
     ("cntUsage", c_ulong), 
     ("th32ProcessID", c_ulong), 
     ("th32DefaultHeapID", POINTER(c_ulong)), 
     ("th32ModuleId", c_ulong), 
     ("cntThreads", c_ulong), 
     ("th32ParentProcessID", c_ulong), 
     ("dwFlags", c_ulong), 
     ("szExeFile", c_wchar * MAX_PATH) 
    ] 

Und meine Funktionsdefinitionen:

CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot 
CreateToolhelp32Snapshot.argtypes = [c_ulong, POINTER(c_ulong)] 
CreateToolhelp32Snapshot.restype = c_ulong 

libc = CDLL("msvcrt") 
libc.wcslen.argtypes = [c_wchar_p] 

Process32First = windll.kernel32.Process32First 
Process32First.argtypes = [c_ulong, POINTER(PROCESSENTRY32)] 
Process32First.restype = c_ubyte 

Process32Next = windll.kernel32.Process32Next 
Process32Next.argtypes = [c_ulong, POINTER(PROCESSENTRY32)] 
Process32Next.restype = c_ubyte 

Antwort

1

Siehe Definition für PROCESSENTRY32W

Ihr fehlt pcPriClassBase

("dwSize", c_ulong), 
("cntUsage", c_ulong), 
("th32ProcessID", c_ulong), 
("th32DefaultHeapID", POINTER(c_ulong)), 
("th32ModuleId", c_ulong), 
("cntThreads", c_ulong), 
("th32ParentProcessID", c_ulong), 
("pcPriClassBase" , c_long),<======= 
("dwFlags", c_ulong), 
("szExeFile", c_wchar * MAX_PATH) 

auch versuchen, die folgenden fo Rückgabetyp und ARG vom Typ

Process32First.argtypes = [ c_void_p , POINTER(PROCESSENTRY32) ] 
Process32First.rettype = c_int 

Process32Next.argtypes = [ c_void_p , POINTER(PROCESSENTRY32) ] 
Process32Next.rettype = c_int 

Hinweis, in WinAPI BOOL ein Makro für int ist, HANDLE ist ein Makro für void*

Die C++ Quelle, die Sie Verwendung fehlt der erste Eintrag. Es sollte stattdessen eine Do-While-Schleife verwendet werden. Sie können später damit umgehen. Zum Beispiel:

HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
if (handle) 
{ 
    PROCESSENTRY32 process; 
    process.dwSize = sizeof(PROCESSENTRY32); 
    Process32First(handle, &process); 
    do 
    { 
     std::wcout << process.szExeFile << "\n"; 
    } while (Process32Next(handle, &process)); 
    CloseHandle(handle); 
} 
+0

Vielen Dank; und danke für den Hinweis auf die Verwendung der Do-While-Schleife. – jacob