MFC作成プロセス、取得プロセス、クローズプロセス

3026 ワード

使用する関数は次のとおりです.
1.プロセスの作成
BOOL WINAPI CreateProcess(
  _In_opt_    LPCTSTR               lpApplicationName, //        ,  :c:\\program files\\tensent\\qq\\bin\\qq.exe
  _Inout_opt_ LPTSTR                lpCommandLine,     //   ,    ,          ,           
  _In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes, //     
  _In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,  //    
  _In_        BOOL                  bInheritHandles, 
  _In_        DWORD                 dwCreationFlags,//    ,   0,    
  _In_opt_    LPVOID                lpEnvironment,
  _In_opt_    LPCTSTR               lpCurrentDirectory, 
  _In_        LPSTARTUPINFO         lpStartupInfo, //     ,   STARTUPINFO
  _Out_       LPPROCESS_INFORMATION lpProcessInformation //     ,    PROCESS_INFORMATION
);

作成プロセスコードは次のとおりです.
HANDLE hProc;
void CCreateProcessDlg::OnBnClickedButton1()//    
{
	// TODO:               
	STARTUPINFO si;
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb=sizeof(STARTUPINFO);
	PROCESS_INFORMATION pi;
	memset(&pi, 0, sizeof(PROCESS_INFORMATION));

	BOOL bCreateSuccess = ::CreateProcess(L"C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe",//     (exe)     
		NULL,//      
		NULL,//        
		NULL,//       
		FALSE,  //                   
		0,      //       ,    0,   
		NULL,//          
		NULL,//            
		&si, &pi);
	if (!bCreateSuccess)
	{
		CString str;
		str.Format(L"      :%d",GetLastError());
		::AfxMessageBox(str);
	}
	else
	{
		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
		::AfxMessageBox(L"      ");
	}
	
}

2.ウィンドウ名に従ってプロセスを開く
関連する関数は次のとおりです.
static CWnd* PASCAL FindWindow( 
   LPCTSTR lpszClassName, //   NULL
   LPCTSTR lpszWindowName  //   , QQ, 360,      
);
DWORD WINAPI GetWindowThreadProcessId(
  _In_      HWND    hWnd,
  _Out_opt_ LPDWORD lpdwProcessId
);
HANDLE WINAPI OpenProcess( _In_ DWORD dwDesiredAccess, // PROCESS_ALL_ACCESS _In_ BOOL bInheritHandle, _In_ DWORD dwProcessId );
id, :
void CCreateProcessDlg::OnBnClickedButton3()//    
{
	// TODO:             
	DWORD pid;
	HWND hQQ = ::FindWindow(NULL, L"QQ");
	::GetWindowThreadProcessId(hQQ, &pid);
    hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
	if (hProc == NULL)
	{
		CString str;
		str.Format(L"%d", (int)pid);
		::AfxMessageBox(str);
		::AfxMessageBox(TEXT("      "));
	}
	else
	{
		::AfxMessageBox(TEXT("      "));
	}
}

3.プロセスのクローズ
BOOL WINAPI TerminateProcess(
  _In_ HANDLE hProcess,
  _In_ UINT   uExitCode
);

::TerminateProcess(hProc, 0); //  hProcess      openprocess()