| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #include "StdAfx.h"
- #include "DaemonClient.h"
- #include <io.h>
- #include <tlhelp32.h>
- 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);
- }
|