2012-01-19 5 views
2

私はpywin32-216-win32-py2.7をインストールして、Windows 7でPython 2.7を実行しています。私は次のコードを実行していますが、1台のコンピュータで正常に動作しますが、別のコンピュータ(Win7、Py2.7、同じpywinライブラリ)でエラーが出力されます。win32pdh.EnumObjectItems呼び出しエラー

エラーメッセージ:

File "C:\Energy\Support Sheets\Kill Excel.py", line 9, in GetProcessID items, instances = win32pdh.EnumObjectItems(None, None, object, win32pdh.PERF_DETAIL_WIZARD) error: (-1073738824, 'EnumObjectItems for buffer size', 'The specified object was not found on the computer.')

全コード:

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!' 
+0

あなたのロケールは英語ですか?そうでない場合、オブジェクト名のスペルが異なる可能性があります。 – Frank

答えて

1

プロセスのパフォーマンスカウンタが無効になっていたとき、私は同じ問題を持っていた - どうやらこれはちょうど起こることができます。カウンターを再度有効にする方法については、hereの指示があります。マシンにソフトウェアをインストールできない場合は、regeditを実行し、「Disable Performance Counters」というキーを検索して削除します。

その後、動作する前にパフォーマンスカウンタをリロードするには、管理者としてcmdシェルで "lodctr/R"を実行する必要があります。

関連する問題