单例程序的实现

来源:互联网 发布:it招聘信息网 编辑:程序博客网 时间:2024/06/11 09:34

一、利用信号量实现进程间


代码如下:
       
 HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName); // 创建命名的信号量        // 信号量存在,则程序已有一个实例运行        if (GetLastError() == ERROR_ALREADY_EXISTS)        {            // 关闭信号量句柄            CloseHandle(hSem);            // 寻找先前实例的主窗口            HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);            while (::IsWindow(hWndPrevious))            {                // 检查窗口是否有预设的标记                if (::GetProp(hWndPrevious, m_pszExeName))                {                    // 主窗口已最小化,则恢复其大小                    if (::IsIconic(hWndPrevious))                    {                        ::ShowWindow(hWndPrevious,SW_RESTORE);                    }                    // 将主窗激活                    ::SetForegroundWindow(hWndPrevious);                    // 将主窗的对话框激活                    ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));                    // 退出本实例                    return FALSE;                }                // 继续寻找下一个窗口                hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);            }            // 前一实例已存在,但找不到其主窗            // 可能出错了            // 退出本实例            return FALSE;        }

二、创建共享数据段实现

#pragma data_seg("MYDATA")  //在此处定义变量,例如int i = 0; #pragma data_seg () 
#pragma comment(linker,"/SECTION:MYDATA,RWS") //设置改段为共享段

三、利用socket通讯实现
         
0 0