双进程守护
BOOL C守护者1号Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 1.创建守护者线程 CreateThread(NULL, NULL, ThreadProc1, NULL, 0, NULL); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void C守护者1号Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。
WORD WINAPI ThreadProc2( _In_ LPVOID lpParameter ) { STARTUPINFO st = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pt = {}; while (true) { HWND hWnd = ::FindWindow(NULL, L"守护者1号"); if (hWnd == NULL) {//2号需要创建 CreateProcess(L"D:\\Project\\Test002\\Debug\\守护者1号.exe", NULL, NULL, NULL, NULL, NULL, NULL, NULL, &st, &pt); WaitForSingleObject(pt.hProcess, -1); } else {// 2号已经打开 DWORD dwPid = 0; GetWindowThreadProcessId(hWnd, &dwPid); HANDLE hProc = OpenProcess(SYNCHRONIZE, NULL, dwPid); WaitForSingleObject(hProc, -1); } } return 0; }
让数据变得更安全!