#include "StdAfx.h" #include "DaemonClient.h" #include #include SINGLETON_IMPLEMENT(CDaemonClient) CDaemonClient::CDaemonClient(void) : m_Stop(true) { } CDaemonClient::~CDaemonClient(void) { m_Stop = true; if(m_FileConfig != NULL) CloseHandle(m_FileConfig); if(m_MapFileConfig != NULL) CloseHandle(m_MapFileConfig); } /***************************************************************** **【函数名称】 __threadFunc **【函数功能】 映射文件的写线程 **【参数】 **【返回值】 ****************************************************************/ UINT CDaemonClient::__threadFunc( LPVOID pParam ) { CDaemonClient* pSelf = (CDaemonClient*)pParam; ASSERT(pSelf != NULL); while(!pSelf->m_Stop) { pSelf->__setSignal(); Sleep(WATCH_TIMER_CLIENT); } return 0; } /***************************************************************** **【函数名称】 __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 } /***************************************************************** **【函数名称】 __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); } /***************************************************************** **【函数名称】 doWork **【函数功能】 监控客户端开始工作 **【参数】 **【返回值】 ****************************************************************/ void CDaemonClient::doWork() { // 初始化文件映射 if(!__initMapFile()) return; // 获取进程名称 __getProcessName(m_ProcessName); // 启动读写线程 m_Stop = false; AfxBeginThread(__threadFunc, this); }