#python下通过ctypes使用原生C函数获取进程名(szExeFile)失败问题
代码如下:
from ctypes.wintypes import DWORD
from ctypes import (
Structure,
c_char,
sizeof,
byref,
windll,
)
PATH_MAX= c_char*265 #为什么我的不能小与265?别人是260
class structure(Structure): #参照C自制结构体
_fields_ = [
('dwSize',DWORD),
('cntUsage',DWORD),
('th32ProcessID',DWORD),
('th32DefaultHeapID',DWORD),
('th32ModuleID',DWORD),
('cntThreads',DWORD),
('th32ParentProcessID',DWORD),
('pcPriClassBase',DWORD),
('dwFlags',DWORD),
('szExeFile',PATH_MAX) #注意这个值
]
def win32showprocess():
CreateToolhelp32Snapshot=windll.kernel32.CreateToolhelp32Snapshot #获取进程快照
store_struc=structure()
store_struc.dwSize=sizeof(structure) #初始化结构体
kz_handle=CreateToolhelp32Snapshot(0x2,0)
if windll.kernel32.Process32First(kz_handle,byref(store_struc)):
while windll.kernel32.Process32Next(kz_handle,byref(store_struc)):
yield store_struc
processlist=win32showprocess()
#以下代码试图通过for循环获取进程名称,结果与预期不符,得到单个的char,似乎也不是首字母。不知道是什么。如下:
for processinfo in processlist:
print('进程ID:%d\t进程名称:%s'%(processinfo.th32ProcessID,processinfo.szExeFile))
进程ID:4 进程名称:b'\x08'
进程ID:236 进程名称:b'\x08'
#我尝试使用psutil模块获取进程名称,结果如预期一致:
from psutil import Process
for processinfo in processlist:
print('进程ID:%d\t进程名称:%s'%(processinfo.th32ProcessID,Process(processinfo.th32ProcessID).name()))
进程ID:4 进程名称:System
进程ID:236 进程名称:Registry
使用环境window10 python3.9.13
输出时szExeFile的类型为‘bytes’,所有长度均为1,怀疑是在szExeFile写入时就出了问题。
问题:第一个for的问题处在哪里?产生的原因是什么,怎么避免。