C ++(Win32)でプロセスを効果的に強制終了する方法は?

c++ process winapi
C ++(Win32)でプロセスを効果的に強制終了する方法は?

私は現在非常に軽量なプログラムを書いているので、プログラムのサイズを大幅に増やす.NETフレームワークにバインドされていないため、C ++を使用する必要があります。

プロセスを終了できるようにする必要があり、そのためにはプロセスハンドルを取得する必要があります。 残念ながら、私はまだそれを行う方法を理解していません。

P.S. プロセスを強制終了するには、_TerminateProcess_を使用する必要があることを知っています。

  14  10


ベストアンサー

OpenProcess()に必要なPIDは、通常、簡単に入手することはできません。 取得したすべてがプロセス名である場合、マシン上で実行中のプロセスを繰り返す必要があります。 CreateToolhelp32Snapshotでこれを行い、続いてProcess32Firstを実行し、Process32Nextでループします。 PROCESSENTRY32.szExeFileはプロセス名(パスではありません!)を提供し、th32ProcessIDはPIDを提供します。

次の考慮事項は、プロセスが複数回表示される可能性があることです。 また、非常に異なるプログラムに同じプロセス名が使用される可能性があります。 「セットアップ」のような。 それらをすべて強制終了したくない場合は、それらからいくつかのランタイム情報を取得しようとする必要があります。 ウィンドウキャプションバーのテキスト。 GetProcessImageFileName()は、.exeへのパスを提供できます。 ネイティブカーネル形式を使用します。ディスクドライブのデバイス名をドライブ文字にマッピングするには、QueryDosDeviceが必要です。

次の考慮事項は、OpenProcess()で要求する権利です。 PROCESS_ALL_ACCESS`を取得する可能性は低く、必要なのは PROCESS_TERMINATE`だけです。 それにも特権がありますが。 プログラムの実行に使用するアカウントがその権利を取得できることを確認してください。

15


既知の名前を持つプロセスを殺すためにすべての苦痛を経験するのではなく、単に「システム」を呼び出して、コマンドラインにそれを殺すように頼ってみませんか?

例えば、

int retval = ::_tsystem( _T("taskkill /F /T /IM MyProcess.exe") );

12


TerminateProcessに渡すハンドルを取得するには、http://msdn.microsoft.com/en-us/を使用しますlibrary / ms684320(VS.85).aspx [OpenProcess]とhttp://msdn.microsoft.com/en-us/library/ms682629(VS.85).aspx[EnumProcesses]のような他の関数との組み合わせ。

5


HANDLE explorer;
explorer = OpenProcess(PROCESS_ALL_ACCESS,false,2120);
TerminateProcess(explorer,1);

うまくいった

5


Visual Studio 2010 C ++プロジェクトの完全な例は、* EXE *ファイル名でプロセスを強制終了する方法です。

それを確認するには、Internet Explorerを実行し、その後、次のコードを実行します。

#include
#include
#include
#include
#include
#include

using namespace std;

//  Forward declarations:
BOOL GetProcessList();
BOOL TerminateMyProcess(DWORD dwProcessId, UINT uExitCode);

int main( void )
{
  GetProcessList( );
  return 0;
}

BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  PROCESSENTRY32 pe32;
  DWORD dwPriorityClass;

  // Take a snapshot of all processes in the system.
  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    return( FALSE );
  }

  // Set the size of the structure before using it.
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  // Retrieve information about the first process,
  // and exit if unsuccessful
  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    CloseHandle( hProcessSnap );  // clean the snapshot object
    return( FALSE );
  }

  // Now walk the snapshot of processes
  do
  {
    string str(pe32.szExeFile);

    if(str == "iexplore.exe") // put the name of your process you want to kill
    {
        TerminateMyProcess(pe32.th32ProcessID, 1);
    }
  } while( Process32Next( hProcessSnap, &pe32 ) );

  CloseHandle( hProcessSnap );
  return( TRUE );
}

BOOL TerminateMyProcess(DWORD dwProcessId, UINT uExitCode)
{
    DWORD dwDesiredAccess = PROCESS_TERMINATE;
    BOOL  bInheritHandle  = FALSE;
    HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    if (hProcess == NULL)
        return FALSE;

    BOOL result = TerminateProcess(hProcess, uExitCode);

    CloseHandle(hProcess);

    return result;
}

C#のように想像してみてください

using System;
using System.Collections.Generic;
using System.Text;

namespace MyProcessKiller
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
            {
                if (myProc.ProcessName == "iexplore")
                {
                    myProc.Kill();
                }
            }
        }
    }
}

3


http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx [CreateProcess]およびhttp://msdn.microsoft.com/en-us/library/ms684320%28VS .85%29.aspx [OpenProcess]はプロセスハンドルを返します。

次に、システムにすべてのプロセスをリストしてからリストを検索してプロセスを見つけるためのhttp://msdn.microsoft.com/en-us/library/ms686701%28VS.85%29.aspx [サンプルコード]を示します。あなたが望むプロセス。

1


「ShouldBeDead.exe」というプロセスを強制終了するサンプルコードを次に示します。

// you will need these headers, and you also need to link to Psapi.lib
#include
#include

...
// first get all the process so that we can get the process id
DWORD processes[1024], count;
if( !EnumProcesses( processes, sizeof(processes), &count ) )
{
    return false;
}

count /= sizeof(DWORD);
for(unsigned int i = 0; i < count; i++)
{
    TCHAR szProcessName[MAX_PATH] = TEXT("");
    if(processes[i] != 0)
    {
        // remember to open with PROCESS_ALL_ACCESS, otherwise you will not be able to kill it
        HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processes[i] );
        if(NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
                GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR));

                // find the process and kill it
                if(strcmp(szProcessName, "ShouldBeDead.exe") == 0)
                {
                    DWORD result = WAIT_OBJECT_0;
                    while(result == WAIT_OBJECT_0)
                    {
                        // use WaitForSingleObject to make sure it's dead
                        result = WaitForSingleObject(hProcess, 100);
                        TerminateProcess(hProcess, 0);
                    }

                    CloseHandle(hProcess);
                }
            }
        }
    }
}

0


窓のみ

system("taskkill /f /im servicetokill.exe")

0


タイトルとURLをコピーしました