#include "StdAfx.h" #include "DaemonClient.h" #include #include SINGLETON_IMPLEMENT(CDaemonClient) CDaemonClient::CDaemonClient(void) : m_pProcessInfo(NULL), m_FileConfig(INVALID_HANDLE_VALUE), m_MapFileConfig(INVALID_HANDLE_VALUE) { ZeroMemory(m_ProcessName, PROCESS_NAME_LEN); CreateEx(0, AfxRegisterWndClass(CS_GLOBALCLASS), "", 0, 0, 0, 0, 0, 0, 0); } CDaemonClient::~CDaemonClient(void) { KillTimer(TIMER_WATCH_ID); if(m_FileConfig != NULL) CloseHandle(m_FileConfig); if(m_MapFileConfig != NULL) CloseHandle(m_MapFileConfig); } BEGIN_MESSAGE_MAP(CDaemonClient, CWnd) ON_WM_TIMER() END_MESSAGE_MAP() /***************************************************************** **【函数名称】 doWork **【函数功能】 监控客户端开始工作 **【参数】 **【返回值】 ****************************************************************/ void CDaemonClient::doWork() { // 初始化文件映射 if(!__initMapFile()) return; // 获取进程名称 __getProcessName(m_ProcessName); // 创建定时器 SetTimer(TIMER_WATCH_ID, WATCH_TIMER_CLIENT, NULL); } void CDaemonClient::Release() { KillTimer(TIMER_WATCH_ID); if (m_FileConfig != NULL) CloseHandle(m_FileConfig); if (m_MapFileConfig != NULL) CloseHandle(m_MapFileConfig); } /***************************************************************** **【函数名称】 __initMapFile **【函数功能】 初始化文件映射 **【参数】 **【返回值】 ****************************************************************/ BOOL CDaemonClient::__initMapFile() { // 加载配置文件 if(_access(FILE_PATH, 0) == -1) CreateDirectoryA(FILE_PATH, NULL); m_FileConfig = CreateFile(FILE_NAME, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(m_FileConfig == NULL) return FALSE; // 打开内存映射文件 m_MapFileConfig = CreateFileMapping(m_FileConfig, NULL, PAGE_READWRITE, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT, VIEW_NAME); if(m_MapFileConfig == NULL) { CloseHandle(m_FileConfig); m_FileConfig = NULL; return FALSE; } // 映射文件对象到进程地址空间 LPVOID hViewFile = MapViewOfFile(m_MapFileConfig, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT); if(hViewFile == NULL) { CloseHandle(m_MapFileConfig); m_MapFileConfig = NULL; CloseHandle(m_FileConfig); m_FileConfig = NULL; return FALSE; } // 保存内存指针 if(m_FileConfig != NULL) { CloseHandle(m_FileConfig); m_FileConfig = NULL; } if(m_MapFileConfig != NULL) { CloseHandle(m_MapFileConfig); m_MapFileConfig = NULL; } m_pProcessInfo = (ProcessInfo*)hViewFile; return TRUE; } /***************************************************************** **【函数名称】 __setSignal **【函数功能】 设置进程标志 **【参数】 **【返回值】 ****************************************************************/ void CDaemonClient::__setSignal() { for(int i = 0; i < WATCH_MAX_COUNT; i++) { if(strcmp(m_pProcessInfo[i].m_szName, m_ProcessName) == 0) { m_pProcessInfo[i].m_bActiveFlag = TRUE; } } // endfor } /***************************************************************** **【函数名称】 OnTimer **【函数功能】 定时器处理 **【参数】 **【返回值】 ****************************************************************/ void CDaemonClient::OnTimer(UINT_PTR nIDEvent) { // 设置进程状态信息 if(nIDEvent == TIMER_WATCH_ID) __setSignal(); CWnd::OnTimer(nIDEvent); } /***************************************************************** **【函数名称】 __getProcessName **【函数功能】 获取当前进程名 **【参数】 lpProcessName 进程名称 **【返回值】 ****************************************************************/ void CDaemonClient::__getProcessName(LPTSTR lpProcessName) { HANDLE hSnapshot; PROCESSENTRY32 lppe; DWORD dwID = GetCurrentProcessId(); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hSnapshot == INVALID_HANDLE_VALUE) return; lppe.dwSize = sizeof(PROCESSENTRY32); if(Process32First(hSnapshot, &lppe)) { do { if(lppe.th32ProcessID == dwID) { lstrcpy(lpProcessName, lppe.szExeFile); break; } } while(Process32Next(hSnapshot, &lppe)); // 查找下一个进程 } CloseHandle(hSnapshot); }