win32pdh.EnumObjectItems 调用错误

2 投票
2 回答
2081 浏览
提问于 2025-04-17 10:38

我在Windows 7上运行Python 2.7,并安装了pywin32-216-win32-py2.7。我在一台电脑上运行以下代码时一切正常,但在另一台电脑上却出现了错误(两台电脑都是Win7,Py2.7,使用的是相同的pywin库)。

错误信息:

文件 "C:\Energy\Support Sheets\Kill Excel.py",第9行,在GetProcessID中 items, instances = win32pdh.EnumObjectItems( None, None, object, win32pdh.PERF_DETAIL_WIZARD ) 错误: (-1073738824, 'EnumObjectItems for buffer size', '指定的对象在计算机上未找到。')

完整代码:

import win32api, win32con
import win32pdh
import os
import signal
import time

def GetProcessID( name ) :
    object = "Process"
    items, instances = win32pdh.EnumObjectItems( None, None, object, win32pdh.PERF_DETAIL_WIZARD )
    val = None
    if name in instances :
        hq = win32pdh.OpenQuery()
        hcs = [ ]
        item = "ID Process"
        path = win32pdh.MakeCounterPath( ( None, object, name, None, 0, item ) )
        hcs.append( win32pdh.AddCounter( hq, path ) )
        win32pdh.CollectQueryData( hq )
        time.sleep( 0.01 )
        win32pdh.CollectQueryData( hq )

        for hc in hcs:
            type, val = win32pdh.GetFormattedCounterValue( hc, win32pdh.PDH_FMT_LONG )
            win32pdh.RemoveCounter( hc )
        win32pdh.CloseQuery( hq )
        return val

def Kill_Process_pid(pid):
  handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid) #get process handle
  win32api.TerminateProcess(handle, -1) #kill by handle
  win32api.CloseHandle(handle)        #close api

def Kill_Process(name):
    pid = GetProcessID(name)
    if pid:
        try:
            Kill_Process_pid(pid)
            return True
        except:
            pass
    else:
        return False

# MAIN FUNCTION
print 'Killing Excel instances...',
while Kill_Process('EXCEL'):
   time.sleep(0.2)
print 'Done!'

2 个回答

0

手动重建性能计数器解决了我的问题,你可以按照以下步骤手动重建并重新同步性能计数器与Windows管理工具(WMI)。

重建计数器:

cd c:\windows\system32
lodctr /R
cd c:\windows\sysWOW64
lodctr /R

与Windows管理工具(WMI)重新同步计数器:

WINMGMT.EXE /RESYNCPERF
1

我之前也遇到过同样的问题,那就是进程性能计数器被禁用了——这似乎是可能会发生的事情。这里有一些说明,教你如何重新启用这些计数器,可以点击这里查看。如果你不能在机器上安装软件,可以打开注册表编辑器(regedit),搜索名为“Disable Performance Counters”的键,然后把它们删除。

之后,你可能需要以管理员身份在命令提示符下运行“lodctr /R”,这样才能重新加载性能计数器,确保它能正常工作。

撰写回答