第一步:
定义全局共享数据段
#pragma data_seg(".drectve")
static char szLinkDirectiveShared[] = "-section:.xam,rws";//告诉编译器该数据段是共享全局的
#pragma data_seg()
/*
在共享数据段中定义变量(当然在这里定义的是全局的)
*/
#pragma data_seg(".xam")
LONG xamInstanceCount = 0;//计数
HWND pHWndPrev = NULL;//已运行的实例
#pragma data_seg()
//或者如下方式告知编译器该数据段是共享全局
#pragma comment(linker,"/section:.xam,rws")
第二步:
在第一次运行程序是给全局共享数据附值
initialDialog 事件中:
InterlockedExchange( (LONG*)&pHWndPrev,(LONG)this->m_hWnd);
InitInstance()事件中:
//[Begin]
//InterlockedIncrement(&xamInstanceCount);
/*[如果 xamInstanceCount > 0 那么
通过pHWndPrev 找出已运行的实例显示;
并返回 FALSE。]*/
//计数大于0表示有实例运行中m_hWnd 标记已运行实例
BOOL bRet = (InterlockedIncrement(&xamInstanceCount)==1);
if(bRet==FALSE){
if(pHWndPrev!=NULL){
CWnd *pWndChild;
CWnd WndPrev;
WndPrev.Attach(pHWndPrev);
pWndChild = WndPrev.GetLastActivePopup();
if (WndPrev.IsIconic()){
WndPrev.ShowWindow(SW_RESTORE);
}
pWndChild->SetForegroundWindow();
WndPrev.Detach();
}
return FALSE;
}
//当退出InitInstance()是:xamInstanceCount计数减1;
InterlockedDecrement(&xamInstanceCount);
//[END]