2

別のアプリケーションを閉じる必要がある win7 プラットフォームの c++ でアプリケーションを作成しています。私が使用する手順は次のとおりです。

  1. EnumProcess() ですべてのプロセスを列挙します。
  2. OpenProcess() でプロセス ハンドルを開きます。アクセス権は PROCESS_ALL_ACCESS|PROCESS_VM_READ です。
  3. 次に、EnumProcessModules() でプロセス モジュールを列挙します。
  4. モジュール名を GetModuleBaseName() で抽出し、持っているプロセス名と比較します。
  5. 一致するものが見つかったら、TerminateProcess() を使用してプロセスを強制終了します。

私が直面している問題は、これが WindowsXP では機能するが、Windows 7 (64 ビット) では機能しないことです。getlasterror() を使用すると、「アクセスが拒否されました」というエラーが表示されます。アクセス権と関係があると思います。両方のプラットフォームでこれを行う方法はありますか? または、win7 固有の API はありますか?

4

2 に答える 2

3

私も同じ問題を抱えていました。答えを非常に長い間探していて、ついに見つけました。

別のプログラムを終了したい場合は、ハンドルが必要です。ハンドルには、他のプロセスと連携するためのアクセス許可が必要です。プロセスを終了するには、 と呼ばれる特定の権限が必要PROCESS_TERMINATEです。終了のためにハンドルを開くときにそれを使用すると、おそらくうまくいくでしょう。Windows 7で、それは私のためにしました。

要約すると、正しく使用する必要があるコードは次のとおりですTerminateProcess。取扱注意 ;)

Declare Function OpenProcess Lib "kernel32" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessID As Long) As Long
Declare Function TerminateProcess Lib "kernel32.dll" ( _
    ByVal ApphProcess As Long, _
    ByVal uExitCode As Long) As Long

Const PROCESS_TERMINATE = &H1

Private Sub KillProcess(ByVal ProcessID As Long)
    Dim pHandle As Long
    pHandle = OpenProcess(PROCESS_TERMINATE, 0, ProcessID)
    Call TerminateProcess(pHandle, 0)
End Sub
于 2012-04-20T12:20:00.020 に答える
1

管理者権限でプログラムを実行していて、同じユーザーの処理を終了していますか?

于 2011-01-05T13:20:34.577 に答える