/******************************************************************************
Module: AppInst.cpp
Notices: Copyright (c) 2000 Jeffrey Richter
******************************************************************************/
#include "..CmnHdr.h" /* See Appendix A. */
#include <windowsx.h>
#include <tchar.h>
#include "Resource.h"
///////////////////////////////////////////////////////////////////////////////
// 系统及的独特窗口消息
UINT g_uMsgAppInstCountUpdate = INVALID_ATOM;
///////////////////////////////////////////////////////////////////////////////
// 告诉编译器将这个初始化变量放在自己的Shared区域
// 以便它可以被所有这个程序的实例访问
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()
// 告诉编译器把这个区域设为可读可写与共享
#pragma comment(linker, "/Section:Shared,RWS")
///////////////////////////////////////////////////////////////////////////////
BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
chSETDLGICONS(hwnd, IDI_APPINST);
// 强制广播
PostMessage(HWND_BROADCAST, g_uMsgAppInstCountUpdate, 0, 0);
return(TRUE);
}
///////////////////////////////////////////////////////////////////////////////
void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch (id)
{
case IDCANCEL:
EndDialog(hwnd, id);
break;
}
}
///////////////////////////////////////////////////////////////////////////////
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == g_uMsgAppInstCountUpdate)
{
SetDlgItemInt(hwnd, IDC_COUNT, g_lApplicationInstances, FALSE);
}
switch (uMsg)
{
chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
}
return(FALSE);
}
///////////////////////////////////////////////////////////////////////////////
int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
// 得到系统级的窗口消息
g_uMsgAppInstCountUpdate = RegisterWindowMessage(TEXT("MsgAppInstCountUpdate"));
// 有另一个实例运行
InterlockedExchangeAdd((PLONG) &g_lApplicationInstances, 1);
DialogBox(hinstExe, MAKEINTRESOURCE(IDD_APPINST), NULL, Dlg_Proc);
// 实例关闭了,将这个值减一
InterlockedExchangeAdd((PLONG) &g_lApplicationInstances, -1);
// 让所有的实例更新
PostMessage(HWND_BROADCAST, g_uMsgAppInstCountUpdate, 0, 0);
return(0);
}
//////////////////////////////// End of File //////////////////////////////////