通过 PID 查找进程名称
Finding process name by PID
我正在使用 ctypes 模块和 WinAPI 通过 PID 查找进程名称。
我一直在查看用 C/C++ 编写的 this 示例,它正在工作,除了我的 szExeFile
的大小对于每个进程都是 0 之外。我在使用这个 API 时错过了什么吗?
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)
我对 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)
]
还有我的函数定义:
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
的定义
你的不见了 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)
也尝试以下 fo return 类型和 arg 类型
Process32First.argtypes = [ c_void_p , POINTER( PROCESSENTRY32 ) ]
Process32First.rettype = c_int
Process32Next.argtypes = [ c_void_p , POINTER(PROCESSENTRY32) ]
Process32Next.rettype = c_int
注意,在 WinAPI 中 BOOL
是 int
的宏,HANDLE
是 void*
的宏
您正在使用的 C++ 源代码缺少第一个条目。它应该改用 do-while 循环。你可以稍后再处理。例如:
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);
}
我正在使用 ctypes 模块和 WinAPI 通过 PID 查找进程名称。
我一直在查看用 C/C++ 编写的 this 示例,它正在工作,除了我的 szExeFile
的大小对于每个进程都是 0 之外。我在使用这个 API 时错过了什么吗?
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)
我对 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)
]
还有我的函数定义:
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
你的不见了 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)
也尝试以下 fo return 类型和 arg 类型
Process32First.argtypes = [ c_void_p , POINTER( PROCESSENTRY32 ) ]
Process32First.rettype = c_int
Process32Next.argtypes = [ c_void_p , POINTER(PROCESSENTRY32) ]
Process32Next.rettype = c_int
注意,在 WinAPI 中 BOOL
是 int
的宏,HANDLE
是 void*
您正在使用的 C++ 源代码缺少第一个条目。它应该改用 do-while 循环。你可以稍后再处理。例如:
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);
}