C++內(nèi)核對(duì)象封裝單實(shí)例啟動(dòng)程序的類
//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);
// 取消內(nèi)核對(duì)象的映射
UnmapViewOfFile(hHandle);
CloseHandle(hHandle);
exit(0);
}
}
else // 第一運(yùn)行程序
{
int nNum = sizeof(HANDLE);
// 創(chuàng)建文件映射內(nèi)核對(duì)象
HANDLE hHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HANDLE), strMapFileGUID);
if (hHandle)
{
// 拷貝數(shù)據(jù)到共享文件里
LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
CString strBuffer;
strBuffer.Format(_T("%d"), hWnd);
_tcscpy(lpMapAddr, strBuffer);
// 講寫入文件映射緩沖區(qū)的所有數(shù)據(jù)刷新到磁盤;
::FlushViewOfFile(lpMapAddr, strBuffer.GetLength()+1);
}
}
}
相關(guān)文章
《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理
在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。2020-02-02
C++中測(cè)試程序運(yùn)行時(shí)間的幾種方法總結(jié)
本文介紹了C++中測(cè)量程序運(yùn)行時(shí)間的幾種方法,包括使用GetTickCount()、clock()、Boost庫的timer類以及高精度時(shí)控函數(shù)QueryPerformanceFrequency和QueryPerformanceCounter,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場(chǎng)景
這篇文章主要介紹了實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場(chǎng)景,文章最后的適用性部分則介紹了一些State模式善于處理的情況,需要的朋友可以參考下2016-03-03
C實(shí)現(xiàn)不定長(zhǎng)數(shù)組的示例
今天小編就為大家分享一篇C實(shí)現(xiàn)不定長(zhǎng)數(shù)組的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
C++實(shí)現(xiàn)LeetCode(158.用Read4來讀取N個(gè)字符之二 - 多次調(diào)用)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(158.用Read4來讀取N個(gè)字符之二 - 多次調(diào)用),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

