双进程守护

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;
}
原文地址:https://www.cnblogs.com/Alyoyojie/p/5317250.html