#include "tlhelp32.h"
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
void CTestComExeDlg::MonitorProcess()
{
while(bRun)
{
//CComPtr<IComExecute> pComExecute;
HRESULT hr = ::CoCreateInstance( CLSID_ComExecute, NULL, CLSCTX_ALL,
IID_IComExecute, (void**)&m_pf );
if ( FAILED( hr ) )
{
MonitorProcess();
}
BSTR bstrRet;
m_pf->TestComExe(_bstr_t("abc"), &bstrRet);
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof( pe32 );
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if ( INVALID_HANDLE_VALUE == hProcessSnap )
{
// Recode error information
}
HANDLE hProcess = NULL;
BOOL bMore = ::Process32First( hProcessSnap, &pe32 );
while( bMore )
{
DWORD dwProcessID = pe32.th32ProcessID;
if ( dwProcessID == 0 )
{
bMore = ::Process32Next( hProcessSnap, &pe32 );
continue;
}
hProcess = ::OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID );
TCHAR szAppLocation[MAX_PATH] = _T("");
DWORD dwRet = ::GetModuleFileNameEx( hProcess, NULL,
szAppLocation, MAX_PATH );
if ( 0 == dwRet )
{
bMore = ::Process32Next( hProcessSnap, &pe32 );
CloseHandle( hProcess );
continue;
}
TCHAR szProcessName[MAX_PATH] = _T("");
dwRet = ::GetLongPathName( szAppLocation, szProcessName,
MAX_PATH );
if ( 0 == dwRet )
{
bMore = ::Process32Next( hProcessSnap, &pe32 );
CloseHandle( hProcess );
continue;
}
CString csProcessName = szProcessName;
csProcessName = csProcessName.Right( csProcessName.GetLength()
- csProcessName.ReverseFind(_T('\\')) - 1);
if ( 0 == csProcessName.CompareNoCase(_T("ComExe.exe")))
{
hProcess = OpenProcess( PROCESS_VM_OPERATION|SYNCHRONIZE, FALSE, dwProcessID );
m_ProcessID = hProcess;
break;
}
bMore = ::Process32Next( hProcessSnap, &pe32 );
}
CloseHandle( hProcessSnap );
WaitForSingleObject( hProcess, INFINITE );
m_pf = NULL;
}
}