class Files_start_Dlg : public CDialog਍਀笀ഀ

਍਀⼀⼀⸀⸀⸀ഀ

਍਀ഀ

public:਍਀ഀ

	///////////////////////////////////////////////////////////////////////////////////////਍਀ऀ⼀⼀ 䴀䈄㸄 㐀㈄㔄 ㈀㸄㜄㰄㸄㘄㴄㸄䄄䈄㠄 㼀㸄㬄䌄䜄㠄䈄䰄 倀爀漀挀攀猀猀䤀䐀㨀 㨀〄㨄䌄丄 㠀䄄㼄㸄㬄䰄㜄㸄㈄〄䈄䰄 ⴀ 㨀〄㘄㐄䬄㤄 䀀㔄䠄〄㔄䈄 䄀〄㰄㨄ഀ

	///////////////////////////////////////////////////////////////////////////////////////਍਀ഀ

	// возвращает ID процесса਍਀ऀ猀琀愀琀椀挀 戀漀漀氀 最攀琀倀爀漀挀攀猀猀䤀搀 ⠀ 挀漀渀猀琀 挀栀愀爀 ⨀瀀倀爀漀最爀一愀洀攀开椀渀Ⰰ 䐀圀伀刀䐀 ⨀瀀琀栀㌀㈀倀爀漀挀攀猀猀䤀䐀开漀甀琀Ⰰ 戀漀漀氀 戀圀椀琀栀吀爀愀挀攀猀 㴀 琀爀甀攀 ⤀㬀ഀ

	// возвращает ID процесса и ID thread-a਍਀ऀ猀琀愀琀椀挀 戀漀漀氀 䜀攀琀倀爀漀挀攀猀猀䈀礀䔀砀攀一愀洀攀 ⠀ 䌀匀琀爀椀渀最☀ 䔀砀攀一愀洀攀Ⰰ 䐀圀伀刀䐀☀ 搀眀吀栀爀攀愀搀䤀搀Ⰰ 䐀圀伀刀䐀☀ 搀倀爀漀挀䤀搀 ⤀㬀ഀ

਍਀ऀ⼀⼀ⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀഀ

	// разные возможности убить запущенный процесс਍਀ഀ

	//используется taskkill.exe਍਀ऀ猀琀愀琀椀挀 瘀漀椀搀 䬀椀氀氀倀爀漀挀攀猀猀开琀愀猀欀欀椀氀氀⠀挀漀渀猀琀 挀栀愀爀⨀ 挀漀渀猀琀 瀀䔀砀攀一愀洀攀⤀㬀ഀ

਍਀ऀ⼀⼀㠀䄄㼄㸄㬄䰄㜄䌄㔄䈄䄄伄 㸀䈄㼄䀄〄㈄㨄〄 䄀㸄㸄㄄䤄㔄㴄㠄伄 圀䴀开䌀䰀伀匀䔀 ㌀㬄〄㈄㴄㸄㰄䌄 㸀㨄㴄䌄 㼀䀄㸄䘄㔄䄄䄄〄ഄ

	static void KillProcess_sendMsg ( CString& sProcessName);਍਀ഀ

	//вызовом TerminateProcess਍਀ऀ猀琀愀琀椀挀 瘀漀椀搀 䬀椀氀氀倀爀漀挀攀猀猀开琀攀爀洀椀渀愀琀攀倀爀漀挀 ⠀ 挀漀渀猀琀 䌀匀琀爀椀渀最☀ 猀倀爀漀挀攀猀猀一愀洀攀⤀㬀ഀ

਍਀ऀ⼀⼀䄀㸄㜄㐄〄䈄䰄 㠀 䈀䌄䈄 㘀㔄 䌀㄄㠄䈄䰄 㼀䀄㸄䘄㔄䄄䄄 ⠀㜀〄䜄㔄㰄 ⴀ 㐀䀄䌄㌄㸄㔄 㐀㔄㬄㸄 㨀⤀ ⤀ഀ

	static void KillProcess_createTerminateProc ( const CString& sProcessName);਍਀ഀ

	//запустить процесс и дождаться, пока он не завершится сам਍਀ऀ⼀⼀⠀　㴄〄㬄㸄㌄ ∀猀琀愀爀琀 ⼀眀愀椀琀∀ 㠀㜄 㼀〄㨄㔄䈄㴄㸄㌄㸄 䐀〄㤄㬄〄⤄ഀ

	static bool st_RunProcessAndWaitWhenDone( const char* szApplicationName, ਍਀ऀऀऀऀऀऀऀ挀漀渀猀琀 挀栀愀爀⨀ 猀稀䌀漀洀洀愀渀搀䰀椀渀攀开椀 㴀 　Ⰰഀ

							const char* szCurrentDirectory = 0, DWORD dwdTimeOut_i = -1 );਍਀ഀ

	//получить путь к system32 (со слешем на конце)਍਀ऀ猀琀愀琀椀挀 䌀匀琀爀椀渀最 䜀攀琀匀礀猀琀攀洀倀䄀吀䠀开开⠀⤀㬀ഀ

	਍਀ഀ

};਍਀ഀ

// все перечисленные вызовы функций работают, просто਍਀⼀⼀ 䄀㸄㸄䈄㈄㔄䈄䄄䈄㈄㔄㴄㴄㸄 ㈀ 䐀䌄㴄㨄䘄㠄㠄 㰀㸄㘄㔄䈄 㠀䄄㼄㸄㬄䰄㜄㸄㈄〄䈄䰄䄄伄 䈀㸄㬄䰄㨄㸄 㸀㐄㠄㴄 㠀㜄 䄀㼄㸄䄄㸄㄄㸄㈄㬄ⴀ⤀ഀ

// поэтому остальные закомментированы਍਀瘀漀椀搀 䘀椀氀攀猀开猀琀愀爀琀开䐀氀最㨀㨀伀渀䔀砀攀匀琀漀瀀⠀⤀ ഀ

{਍਀⼀⨀ഀ

	// так можно в одном процессе сначала стартовать, а затем убить другой процесс਍਀ऀ䌀匀琀爀椀渀最 猀倀爀漀挀攀猀猀一愀洀攀㄀ ⠀∀䔀㨀尀尀椀爀椀渀愀尀尀昀猀⸀攀砀攀∀⤀㬀ഀ

	KillProcess_createTerminateProc ( sProcessName1 );਍਀ഀ

਍਀ऀ⼀⼀ 䈀〄㨄 㰀㸄㘄㴄㸄 䌀㄄㠄䈄䰄 㼀䀄㸄䘄㔄䄄䄄Ⰴ 㨀㸄䈄㸄䀄䬄㤄 ㄀䬄㬄 㜀〄㼄䌄䤄㔄㴄 㠀㜄 㐀䀄䌄㌄㸄㌄㸄 㼀䀄㠄㬄㸄㘄㔄㴄㠄伄ഄ

	// вариант 1:਍਀ऀ䌀匀琀爀椀渀最 猀倀爀漀挀攀猀猀一愀洀攀开洀猀最 ⠀ ∀䘀匀∀ ⤀㬀ഀ

	KillProcess_terminateProc (sProcessName_msg);਍਀ഀ

	// вариант 2:਍਀ऀ䌀匀琀爀椀渀最 猀倀爀漀挀攀猀猀一愀洀攀 ⠀ ∀䘀匀∀ ⤀㬀ഀ

	KillProcess_sendMsg (sProcessName);਍਀⨀⼀ഀ

	// вариант 3਍਀ऀ䬀椀氀氀倀爀漀挀攀猀猀开琀愀猀欀欀椀氀氀 ⠀ 猀倀爀漀挀攀猀猀一愀洀攀 ⤀㬀ഀ

}਍਀ഀ

਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

///////////////////////////////////਍਀⼀⼀ ㈀〄䀄㠄〄㴄䈄䬄 㐀㬄伄 欀椀氀氀 瀀爀漀挀攀猀猀㨀ഀ

///////////////////////////////////਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

਍਀ഀ

///////////////////////////////////////////////////////////////਍਀⼀⼀ 䄀 㼀㸄㰄㸄䤄䰄丄 琀愀猀欀欀椀氀氀⸀攀砀攀ഀ

///////////////////////////////////////////////////////////////਍਀瘀漀椀搀 䘀椀氀攀猀开猀琀愀爀琀开䐀氀最㨀㨀䬀椀氀氀倀爀漀挀攀猀猀开琀愀猀欀欀椀氀氀⠀挀漀渀猀琀 挀栀愀爀⨀ 挀漀渀猀琀 瀀䔀砀攀一愀洀攀⤀ഀ

{਍਀ऀ䐀圀伀刀䐀 搀眀吀栀爀攀愀搀䤀搀Ⰰ 搀倀爀漀挀䤀搀㬀ഀ

	CString ExeName = pExeName;਍਀ऀ椀昀⠀℀䜀攀琀倀爀漀挀攀猀猀䈀礀䔀砀攀一愀洀攀 ⠀ 䔀砀攀一愀洀攀Ⰰ 搀眀吀栀爀攀愀搀䤀搀Ⰰ 搀倀爀漀挀䤀搀 ⤀ ⤀ 爀攀琀甀爀渀㬀ഀ

਍਀ऀ䠀䄀一䐀䰀䔀 栀瀀爀㴀　㬀ഀ

	hpr=::OpenProcess ( PROCESS_TERMINATE, 0, dProcId );਍਀ഀ

	if( hpr )਍਀ऀ笀ഀ

		CString txt, sTaskKill ("taskkill.exe");਍਀ഀ

		// не всегда taskkill.exe находится в C:\\windows\\system32, поэтому для гибкости ਍਀ऀऀ⼀⼀ 㴀〄䠄㔄㤄 㼀䀄㸄㌄䀄〄㰄㰄䬄 䄀㠄䄄䈄㔄㰄㴄䬄㤄 㼀䌄䈄䰄 㴀〄䔄㸄㐄㠄㰄 㼀䀄㸄㌄䀄〄㰄㰄㴄䬄㰄 㼀䌄䈄㔄㰄ഄ

		CString sSysPath = GetSystemPATH__();਍਀ഀ

		// убиваем сам процесс и все его Children-Процессы਍਀ऀऀ琀砀琀⸀䘀漀爀洀愀琀⠀ ∀ ⼀挀 ─猀尀─猀 ⼀瀀椀搀 ─搀 ⼀昀 ⼀琀∀Ⰰ猀匀礀猀倀愀琀栀Ⰰ 猀吀愀猀欀䬀椀氀氀Ⰰ 搀倀爀漀挀䤀搀 ⤀㬀ഀ

		਍਀ऀऀ猀琀开刀甀渀倀爀漀挀攀猀猀䄀渀搀圀愀椀琀圀栀攀渀䐀漀渀攀⠀猀匀礀猀倀愀琀栀 ⬀ ∀挀洀搀⸀攀砀攀∀Ⰰ 琀砀琀⤀㬀ഀ

਍਀ऀ紀ഀ

	else਍਀ऀ笀ഀ

		DWORD nErr = GetLastError();਍਀ऀ紀ഀ

਍਀ऀ㨀㨀吀攀爀洀椀渀愀琀攀倀爀漀挀攀猀猀⠀栀瀀爀Ⰰ　⤀㬀ഀ

	::CloseHandle(hpr);਍਀ऀഀ

	return;਍਀紀ഀ

਍਀ഀ

////////////////////////////////////////਍਀⼀⼀ 欀椀氀氀 愀 瀀爀漀挀攀猀猀 眀椀琀栀 琀愀猀欀欀椀氀氀⸀攀砀攀ഀ

////////////////////////////////////////਍਀戀漀漀氀 䘀椀氀攀猀开猀琀愀爀琀开䐀氀最㨀㨀猀琀开刀甀渀倀爀漀挀攀猀猀䄀渀搀圀愀椀琀圀栀攀渀䐀漀渀攀 ⠀ 挀漀渀猀琀 挀栀愀爀⨀ 猀稀䄀瀀瀀氀椀挀愀琀椀漀渀一愀洀攀Ⰰഀ

													 const char* szCommandLine_i,਍਀ऀऀऀऀऀऀऀऀऀऀऀऀऀ 挀漀渀猀琀 挀栀愀爀⨀ 猀稀䌀甀爀爀攀渀琀䐀椀爀攀挀琀漀爀礀Ⰰഀ

													 DWORD dwdTimeOut_i)਍਀笀ഀ

਍਀ऀ匀吀䄀刀吀唀倀䤀一䘀伀ऀ匀琀愀爀琀甀瀀䤀渀昀漀㬀ഀ

	PROCESS_INFORMATION ProcessInfo;਍਀ऀ䐀圀伀刀䐀 搀眀刀攀琀嘀愀氀甀攀㬀ഀ

਍਀ऀ㨀㨀洀攀洀猀攀琀 ⠀ ☀匀琀愀爀琀甀瀀䤀渀昀漀Ⰰ 　Ⰰ 猀椀稀攀漀昀⠀匀琀愀爀琀甀瀀䤀渀昀漀⤀ ⤀㬀ഀ

	StartupInfo.cb = sizeof ( StartupInfo );਍਀ഀ

	CString csCommandLine = szCommandLine_i; // это обязательно, иначе испортится содержимое строки szCommandLine_i!!! ਍਀ऀ椀昀⠀ ℀㨀㨀䌀爀攀愀琀攀倀爀漀挀攀猀猀⠀ഀ

		szApplicationName, (char*)(const char*)csCommandLine,਍਀ऀऀ　Ⰰ 　Ⰰ 　Ⰰ 一伀刀䴀䄀䰀开倀刀䤀伀刀䤀吀夀开䌀䰀䄀匀匀Ⰰ 　Ⰰ 猀稀䌀甀爀爀攀渀琀䐀椀爀攀挀琀漀爀礀Ⰰഀ

		&StartupInfo, &ProcessInfo))਍਀ऀ笀ഀ

		// oshibka - proverjaem਍਀ऀऀ䐀圀伀刀䐀 搀眀搀䔀爀爀㴀䜀攀琀䰀愀猀琀䔀爀爀漀爀⠀⤀㬀 ഀ

		return false;਍਀ऀ紀ഀ

	else਍਀ऀ笀ഀ

		::CloseHandle ( ProcessInfo.hThread );਍਀ऀऀ㨀㨀圀愀椀琀䘀漀爀匀椀渀最氀攀伀戀樀攀挀琀 ⠀ 倀爀漀挀攀猀猀䤀渀昀漀⸀栀倀爀漀挀攀猀猀Ⰰ 搀眀搀吀椀洀攀伀甀琀开椀 ⤀㬀ഀ

		::GetExitCodeProcess ( ProcessInfo.hProcess, &dwRetValue );਍਀ऀऀ㨀㨀䌀氀漀猀攀䠀愀渀搀氀攀 ⠀ 倀爀漀挀攀猀猀䤀渀昀漀⸀栀倀爀漀挀攀猀猀⤀㬀ഀ

	}਍਀ऀ爀攀琀甀爀渀 琀爀甀攀㬀ഀ

}਍਀ഀ

਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

// terminate process. the process was created in other program਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

void Files_start_Dlg::KillProcess_sendMsg ( CString& sProcessName)਍਀笀ഀ

	DWORD dwThreadId, dProcId; ਍਀ऀ䌀圀渀搀⨀ 瀀圀渀搀 㴀 䘀椀渀搀圀椀渀搀漀眀 ⠀ 一唀䰀䰀Ⰰ 猀倀爀漀挀攀猀猀一愀洀攀⤀㬀ഀ

	਍਀ऀ⼀⼀ 㠀䤄㔄㰄 䤀䐀 㼀䀄㸄䘄㔄䄄䄄〄ഄ

	GetProcessByExeName ( sProcessName, dwThreadId, dProcId );਍਀ഀ

	// получаем handle процесса਍਀ऀ䠀䄀一䐀䰀䔀 栀倀爀漀挀 㴀 㨀㨀伀瀀攀渀倀爀漀挀攀猀猀 ⠀倀刀伀䌀䔀匀匀开䄀䰀䰀开䄀䌀䌀䔀匀匀Ⰰ 昀愀氀猀攀Ⰰ 搀倀爀漀挀䤀搀⤀㬀ഀ

	if ( hProc )਍਀ऀ笀ഀ

		UINT uExitCode = NO_ERROR;਍਀ഀ

		// это не очень корректный способ завершения процесса਍਀ऀऀ⼀⼀䈀伀伀䰀 戀䤀猀吀攀爀洀椀渀愀琀攀搀 㴀 吀攀爀洀椀渀愀琀攀倀爀漀挀攀猀猀 ⠀栀倀爀漀挀Ⰰ 甀䔀砀椀琀䌀漀搀攀 ⤀㬀ഀ

		਍਀ऀऀ⼀⼀ 㼀㸄䴄䈄㸄㰄䌄 䈀〄㨄 㬀䌄䜄䠄㔄 ⠀䔀㸄䈄伄 ㈀ 㼀䀄㠄㴄䘄㠄㼄㔄 㸀㄄〄 㠀㰄㔄丄䈄 㰀㔄䄄䈄㸄 ㄀䬄䈄䰄⤄ഀ

		::SendMessage (pWnd->m_hWnd, WM_CLOSE, 0, 0); ਍਀ഀ

		CloseHandle (hProc);਍਀ऀ紀ഀ

}਍਀ഀ

਍਀ഀ

///////////////////////////////////////////////////////////////਍਀⼀⼀ 琀攀爀洀椀渀愀琀攀 瀀爀漀挀攀猀猀⸀ 琀栀攀 瀀爀漀挀攀猀猀 眀愀猀 挀爀攀愀琀攀搀 椀渀 漀琀栀攀爀 瀀爀漀最爀愀洀 ⠀愀瀀瀀氀椀挀愀琀椀漀渀⤀ഀ

///////////////////////////////////////////////////////////////਍਀瘀漀椀搀 䘀椀氀攀猀开猀琀愀爀琀开䐀氀最㨀㨀䬀椀氀氀倀爀漀挀攀猀猀开琀攀爀洀椀渀愀琀攀倀爀漀挀 ⠀ 挀漀渀猀琀 䌀匀琀爀椀渀最☀ 猀倀爀漀挀攀猀猀一愀洀攀⤀ഀ

{਍਀ऀ䐀圀伀刀䐀 渀倀爀漀挀攀猀猀䤀搀 㴀 　㬀ഀ

਍਀ऀ最攀琀倀爀漀挀攀猀猀䤀搀 ⠀ ∀䘀匀⸀攀砀攀∀Ⰰ ☀渀倀爀漀挀攀猀猀䤀搀Ⰰ 昀愀氀猀攀⤀㬀ഀ

਍਀ऀ䠀䄀一䐀䰀䔀 栀倀爀漀挀 㴀 㨀㨀伀瀀攀渀倀爀漀挀攀猀猀 ⠀倀刀伀䌀䔀匀匀开䄀䰀䰀开䄀䌀䌀䔀匀匀Ⰰ 昀愀氀猀攀Ⰰ 渀倀爀漀挀攀猀猀䤀搀⤀㬀ഀ

	if ( hProc )਍਀ऀ笀ഀ

		UINT uExitCode = NO_ERROR;਍਀ऀऀ䈀伀伀䰀 戀䤀猀吀攀爀洀椀渀愀琀攀搀 㴀 吀攀爀洀椀渀愀琀攀倀爀漀挀攀猀猀 ⠀栀倀爀漀挀Ⰰ 甀䔀砀椀琀䌀漀搀攀 ⤀㬀ഀ

		CloseHandle (hProc);਍਀ऀ紀ഀ

}਍਀ഀ

਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

// create and terminate process in one program਍਀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀ

void Files_start_Dlg::KillProcess_createTerminateProc ( const CString& sProcessName)਍਀笀ഀ

	STARTUPINFO cif;਍਀ऀ娀攀爀漀䴀攀洀漀爀礀⠀☀挀椀昀Ⰰ猀椀稀攀漀昀⠀匀吀䄀刀吀唀倀䤀一䘀伀⤀ ⤀㬀ഀ

	PROCESS_INFORMATION pi;਍਀ഀ

	if ( CreateProcess(sProcessName,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi) )਍਀ऀ笀ഀ

		TerminateProcess(pi.hProcess,NO_ERROR); ਍਀ऀ紀ഀ

}਍਀ഀ

਍਀ഀ

CString Files_start_Dlg::GetSystemPATH__()਍਀笀ഀ

	CString result = "";਍਀ऀ椀渀琀 氀攀渀 㴀 䴀䄀堀开倀䄀吀䠀 ⬀ ㄀㬀ഀ

	char* chSys = new char [len];਍਀ഀ

	::memset( chSys, 0, len );਍਀ഀ

	if( !::GetSystemDirectory (chSys, len) ) return "";਍਀ഀ

	result = chSys;਍਀ऀ爀攀猀甀氀琀 ⬀㴀 ∀尀尀∀㬀ഀ

਍਀ऀ搀攀氀攀琀攀 嬀崀 挀栀匀礀猀㬀ഀ

	chSys=0;਍਀ഀ

	return result;਍਀紀ഀ

਍਀ഀ

////////////////////////////////////////਍਀⼀⼀ 最攀琀 瀀爀漀挀攀猀猀 椀搀 愀渀搀 琀栀爀攀愀搀 椀搀ഀ

////////////////////////////////////////਍਀戀漀漀氀 䘀椀氀攀猀开猀琀愀爀琀开䐀氀最㨀㨀䜀攀琀倀爀漀挀攀猀猀䈀礀䔀砀攀一愀洀攀 ⠀ 䌀匀琀爀椀渀最☀ 䔀砀攀一愀洀攀Ⰰ 䐀圀伀刀䐀☀ 搀眀吀栀爀攀愀搀䤀搀Ⰰ 䐀圀伀刀䐀☀ 搀倀爀漀挀䤀搀 ⤀ഀ

{਍਀ऀ䌀圀渀搀⨀ 瀀圀渀搀 㴀 䘀椀渀搀圀椀渀搀漀眀 ⠀ 一唀䰀䰀Ⰰ 䔀砀攀一愀洀攀⤀㬀ഀ

	dwThreadId = GetWindowThreadProcessId (pWnd->m_hWnd, &dProcId);਍਀ഀ

	return true;਍਀紀ഀ

਍਀ഀ

਍਀ഀ

////////////////////////////////////////਍਀⼀⼀ 最攀琀 瀀爀漀挀攀猀猀 椀搀 ⠀漀琀栀攀爀 眀愀礀⤀ഀ

////////////////////////////////////////਍਀ഀ

// эта функция ищет не только process id, но и все его подмодули. А возвращает только processId ( она была просто быстро подогнана для этого примера )਍਀⼀⼀ 㠀 㔀䤄㔄 ⴀ 㜀㐄㔄䄄䰄 㜀〄㨄㸄㰄㰄㔄㴄䈄㠄䀄㸄㈄〄㴄䬄 ㈀䄄㔄 ㈀䬄㜄㸄㈄䬄 䜀攀琀䐀氀最䤀琀攀洀⠀⤀Ⰰ 䈀⸄㨀⸄ 㸀㴄㠄 㴀㔄 ㄀䌄㐄䌄䈄 䀀〄㄄㸄䈄〄䈄䰄 㠀㜄ⴄ㜀〄 㸀䈄䄄䌄䈄䄄䈄㈄㠄伄 㼀㸄㬄㴄㸄㌄㸄 㼀䀄㸄㔄㨄䈄〄 䄀 䀀㔄䄄䌄䀄䄄〄㰄㠄⸄ഀ

bool Files_start_Dlg::getProcessId ( const char *pProgrName_in, DWORD *pth32ProcessID_out, ਍਀ऀऀऀऀऀऀऀऀऀ 戀漀漀氀 戀圀椀琀栀吀爀愀挀攀猀 ⤀ഀ

{਍਀    䠀䄀一䐀䰀䔀         栀倀爀漀挀攀猀猀匀渀愀瀀 㴀 一唀䰀䰀㬀 ഀ

    BOOL           bRet      = FALSE; ਍਀    倀刀伀䌀䔀匀匀䔀一吀刀夀㌀㈀ 瀀攀㌀㈀      㴀 笀　紀㬀 ഀ

    char           sBuf[10000], sText[10000] ;਍਀    䌀匀琀爀椀渀最        猀䔀搀椀琀吀攀砀琀 㴀 ∀∀㬀 ഀ

਍਀    挀栀愀爀 戀甀昀嬀㄀　　崀㬀ഀ

    DWORD th32ProcessID = 0;਍਀ ഀ

    //  Take a snapshot of all processes in the system. ਍਀    栀倀爀漀挀攀猀猀匀渀愀瀀 㴀 䌀爀攀愀琀攀吀漀漀氀栀攀氀瀀㌀㈀匀渀愀瀀猀栀漀琀⠀吀䠀㌀㈀䌀匀开匀一䄀倀倀刀伀䌀䔀匀匀Ⰰ 　⤀㬀 ഀ

਍਀    椀昀 ⠀栀倀爀漀挀攀猀猀匀渀愀瀀 㴀㴀 䤀一嘀䄀䰀䤀䐀开䠀䄀一䐀䰀䔀开嘀䄀䰀唀䔀⤀ ഀ

        return (FALSE); ਍਀ ഀ

    //  Fill in the size of the structure before using it. ਍਀    瀀攀㌀㈀⸀搀眀匀椀稀攀 㴀 猀椀稀攀漀昀⠀倀刀伀䌀䔀匀匀䔀一吀刀夀㌀㈀⤀㬀 ഀ

 ਍਀    ⼀⼀  圀愀氀欀 琀栀攀 猀渀愀瀀猀栀漀琀 漀昀 琀栀攀 瀀爀漀挀攀猀猀攀猀Ⰰ 愀渀搀 昀漀爀 攀愀挀栀 瀀爀漀挀攀猀猀Ⰰ ഀ

    //  display information. ਍਀    椀昀 ⠀倀爀漀挀攀猀猀㌀㈀䘀椀爀猀琀⠀栀倀爀漀挀攀猀猀匀渀愀瀀Ⰰ ☀瀀攀㌀㈀⤀⤀ ഀ

    { ਍਀        ⼀⼀䐀圀伀刀䐀         搀眀倀爀椀漀爀椀琀礀䌀氀愀猀猀㬀 ഀ

        BOOL          bGotModule = FALSE; ਍਀        䴀伀䐀唀䰀䔀䔀一吀刀夀㌀㈀ 洀攀㌀㈀       㴀 笀　紀㬀 ഀ

        HANDLE        hModSnap = NULL;਍਀ഀ

		//GUITHREADINFO guiThr   = {0};਍਀        䈀伀伀䰀          戀䜀漀琀䜀甀椀吀栀爀攀愀搀 㴀 䘀䄀䰀匀䔀㬀 ഀ

        ਍਀        吀䠀刀䔀䄀䐀䔀一吀刀夀㌀㈀ 琀栀爀㌀㈀   㴀 笀　紀㬀ഀ

        HANDLE        hThrSnap = NULL;਍਀        䈀伀伀䰀          戀䜀漀琀吀栀爀攀愀搀 㴀 䘀䄀䰀匀䔀㬀 ഀ

਍਀        搀漀 ഀ

        { ਍਀            猀琀爀挀瀀礀⠀戀甀昀Ⰰ 瀀攀㌀㈀⸀猀稀䔀砀攀䘀椀氀攀⤀㬀ഀ

            th32ProcessID = pe32.th32ProcessID; ਍਀ഀ

			// test the name of the process਍਀ऀऀऀ椀昀 ⠀　 㴀㴀 猀琀爀挀洀瀀⠀戀甀昀Ⰰ 瀀倀爀漀最爀一愀洀攀开椀渀⤀⤀ഀ

			{਍਀ऀऀऀऀ⼀⼀ 漀渀氀礀 昀漀爀 琀攀猀琀℀ഀ

				if ( bWithTraces )਍਀ऀऀऀऀ笀ഀ

					sprintf(sBuf, "ProcessName = %s	processID = %d \r\n", buf, th32ProcessID);਍਀ഀ

					//GetDlgItem(IDC_PROC_LIST_LIST)->GetWindowText(sEditText);਍਀ऀऀऀऀऀ猀琀爀挀瀀礀⠀猀吀攀砀琀Ⰰ 猀䔀搀椀琀吀攀砀琀⤀㬀ഀ

					strcat(sText, sBuf);਍਀ഀ

					//GetDlgItem(IDC_PROC_LIST_LIST)->SetWindowText(sText); ਍਀ऀऀऀऀ紀ഀ

਍਀ऀऀऀऀ⨀瀀琀栀㌀㈀倀爀漀挀攀猀猀䤀䐀开漀甀琀 㴀 琀栀㌀㈀倀爀漀挀攀猀猀䤀䐀㬀ഀ

                ਍਀ऀऀऀऀ⼀⼀ 漀渀氀礀 昀漀爀 琀攀猀琀 ℀ഀ

				if ( bWithTraces )਍਀ऀऀऀऀ笀ഀ

					// hold all modules (dlls usw.)਍਀ऀऀऀऀऀ栀䴀漀搀匀渀愀瀀 㴀 䌀爀攀愀琀攀吀漀漀氀栀攀氀瀀㌀㈀匀渀愀瀀猀栀漀琀⠀吀䠀㌀㈀䌀匀开匀一䄀倀䴀伀䐀唀䰀䔀Ⰰ 瀀攀㌀㈀⸀琀栀㌀㈀倀爀漀挀攀猀猀䤀䐀⤀㬀 ഀ

					me32.dwSize = sizeof(MODULEENTRY32); ਍਀ऀऀऀऀऀ戀䜀漀琀䴀漀搀甀氀攀 㴀 䴀漀搀甀氀攀㌀㈀䘀椀爀猀琀⠀栀䴀漀搀匀渀愀瀀Ⰰ ☀洀攀㌀㈀⤀㬀ഀ

					while (bGotModule)਍਀ऀऀऀऀऀ笀ഀ

						bGotModule = Module32Next(hModSnap, &me32);਍਀ऀऀऀऀऀ紀ഀ

਍਀ऀऀऀऀऀ⼀⼀ 栀漀氀搀 愀氀氀 琀栀爀攀愀搀猀ഀ

					hThrSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pe32.th32ProcessID); ਍਀ऀऀऀऀऀ琀栀爀㌀㈀⸀搀眀匀椀稀攀 㴀 猀椀稀攀漀昀⠀吀䠀刀䔀䄀䐀䔀一吀刀夀㌀㈀⤀㬀 ഀ

					bGotThread = Thread32First(hThrSnap, &thr32);਍਀ऀ⼀⼀                戀䜀漀琀䜀甀椀吀栀爀攀愀搀 㴀 䜀攀琀䜀唀䤀吀栀爀攀愀搀䤀渀昀漀⠀琀栀爀㌀㈀⸀琀栀㌀㈀吀栀爀攀愀搀䤀䐀Ⰰ ☀最甀椀吀栀爀⤀㬀ഀ

                ਍਀ऀऀऀऀऀ眀栀椀氀攀 ⠀戀䜀漀琀吀栀爀攀愀搀⤀ഀ

					{਍਀ऀऀऀऀऀऀ戀䜀漀琀吀栀爀攀愀搀 㴀 吀栀爀攀愀搀㌀㈀一攀砀琀⠀栀吀栀爀匀渀愀瀀Ⰰ ☀琀栀爀㌀㈀⤀㬀ഀ

					}਍਀ऀऀऀऀ紀ऀ⼀⼀椀昀 ⠀ 戀圀椀琀栀吀爀愀挀攀猀 ⤀ഀ

਍਀ऀऀऀऀ戀爀攀愀欀㬀ഀ

			}਍਀            攀氀猀攀ഀ

            {਍਀ऀऀऀऀ⼀⼀ 漀渀氀礀 昀漀爀 琀攀猀琀 ℀ഀ

				if ( bWithTraces )਍਀ऀऀऀऀ笀ഀ

					sprintf(sBuf, "ProcessName = %s	\r\n  ", buf);਍਀ऀऀऀऀऀ⼀⼀䜀攀琀䐀氀最䤀琀攀洀⠀䤀䐀䌀开倀刀伀䌀开䰀䤀匀吀开䰀䤀匀吀⤀ⴀ㸀䜀攀琀圀椀渀搀漀眀吀攀砀琀⠀猀䔀搀椀琀吀攀砀琀⤀㬀ഀ

					strcpy(sText, sEditText);਍਀ऀऀऀऀऀ猀琀爀挀愀琀⠀猀吀攀砀琀Ⰰ 猀䈀甀昀⤀㬀ഀ

਍਀ऀऀऀऀऀ⼀⼀䜀攀琀䐀氀最䤀琀攀洀⠀䤀䐀䌀开倀刀伀䌀开䰀䤀匀吀开䰀䤀匀吀⤀ⴀ㸀匀攀琀圀椀渀搀漀眀吀攀砀琀⠀猀吀攀砀琀⤀㬀ഀ

				}਍਀ഀ

            }	// if (0 == strcmp(buf, pProgrName_in))਍਀        紀 ഀ

        while (Process32Next(hProcessSnap, &pe32));਍਀ഀ

        bRet = TRUE; ਍਀    紀 ഀ

    else ਍਀ऀ笀ഀ

        bRet 