利用內核對象 封裝的類,使用運行單個實例,防止屢次啓動Demoapp
例子下載地址:http://pan.baidu.com/share/link?shareid=3202369154&uk=3037189616spa
//File Name: Singleton.h #pragma once class Singleton { private: CString strGUID; CString strMapFileGUID; HANDLE m_hSingleton; public: Singleton(); ~Singleton(); public: void AppStart (const HWND & hWnd) const; };
//File Name: Singleton.cpp #include "stdafx.h" #include "Singleton.h" Singleton::Singleton() { strGUID = _T("{D727BDB5-F86A-405b-910D-11AD2A4CA76E}"); strMapFileGUID = strGUID + _T("_MapFile"); m_hSingleton = NULL; } Singleton::~Singleton() { if (m_hSingleton) { CloseHandle(m_hSingleton); m_hSingleton = NULL; } } void Singleton::AppStart(const HWND & hWnd) const { HANDLE m_hSingleton = NULL; m_hSingleton = CreateMutex(NULL, TRUE, strGUID); RECT rect; ZeroMemory(&rect, sizeof(rect)); ::GetWindowRect(hWnd, &rect); if (GetLastError() == ERROR_ALREADY_EXISTS) { // 打開共享文件 HANDLE hHandle = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, strMapFileGUID); if (hHandle) { LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); CString strBuffer(lpMapAddr); HWND hOldWnd = (HWND)_tcstoul(strBuffer, NULL, 10); ::SetForegroundWindow(hOldWnd); // 取消內核對象的映射 UnmapViewOfFile(hHandle); CloseHandle(hHandle); exit(0); } } else // 第一運行程序 { int nNum = sizeof(HANDLE); // 建立文件映射內核對象 HANDLE hHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HANDLE), strMapFileGUID); if (hHandle) { // 拷貝數據到共享文件裏 LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); CString strBuffer; strBuffer.Format(_T("%d"), hWnd); _tcscpy(lpMapAddr, strBuffer); // 講寫入文件映射緩衝區的全部數據刷新到磁盤; ::FlushViewOfFile(lpMapAddr, strBuffer.GetLength()+1); } } }