一、利用信号量实现进程间
代码如下:
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通讯实现