• VC单实例运行


    // SingleInstanceApp.cpp : header file
    //
    // CWinApp with single-instance support
    //
    // Copyright (C) 1997, 1998 Giancarlo Iovino (giancarlo@saria.com)
    // All rights reserved. May not be sold for profit.
    //
    // Thanks to Kevin Lussier for the base idea.
    //
    // This code was developed for MFC Programmers SourceBook
    // (http://www.codeguru.com)
    //

    #ifndef __AFXWIN_H__
        
    #error include 'stdafx.h' before including this file for PCH
    #endif

    #include 
    "resource.h"       // main symbols

    /////////////////////////////////////////////////////////////////////////////
    // CSingleInstanceApp:
    //

    class CSingleInstanceApp : public CWinApp
    {
    public:
        
    // Construction/Destruction
        CSingleInstanceApp();
        
    ~CSingleInstanceApp();

        
    // Operations
        BOOL CheckSingleInstance(UINT nID);
        CString GetClassName() 
    const;

    protected:
        HANDLE m_hMutex;
        CString m_strClassName;
    };


    /////////////////////////////////////////////////////////////////////////////
    代码
    // SingleInstanceApp.cpp : implementation file
    //
    // CWinApp with single-instance support
    //
    // Copyright (C) 1997, 1998 Giancarlo Iovino (giancarlo@saria.com)
    // All rights reserved. May not be sold for profit.
    //
    // Thanks to Kevin Lussier for the base idea.
    //
    // This code was developed for MFC Programmers SourceBook
    // (http://www.codeguru.com)
    //

    #include 
    "stdafx.h"
    #include 
    "SingleInstanceApp.h"
    #define _AFX_NO_OLE_SUPPORT
    #include 
    <../mfc/src/afximpl.h>

    CSingleInstanceApp::CSingleInstanceApp()
    {
        
    // Set our default values
        m_hMutex = NULL;
    }

    CSingleInstanceApp::
    ~CSingleInstanceApp()
    {
        
    // Release the mutex
        if ( m_hMutex != NULL ) {
            ReleaseMutex( m_hMutex );
        }
    }

    BOOL CSingleInstanceApp::CheckSingleInstance(UINT nID) {
        CString strFullString;

        
    // Generate a synthetic name for this class using the
        
    // AfxRegisterWndClass convention
        HINSTANCE hInst = AfxGetInstanceHandle();
        UINT nClassStyle 
    = CS_DBLCLKS;    
        HCURSOR hCursor 
    = LoadCursor(IDC_ARROW );
        HICON    hIcon 
    = LoadIcon(MAKEINTRESOURCE( nID ) );    

        LPCTSTR lpstrAppName 
    = AfxGetAppName();
        ASSERT(lpstrAppName 
    != NULL);

        
    if (hCursor == NULL && hIcon == NULL)
            m_strClassName.Format(_T(
    "%s:%x:%x"), lpstrAppName,
                (UINT)hInst, nClassStyle);
        
    else
            m_strClassName.Format(_T(
    "%s:%x:%x:%x:%x"), lpstrAppName,
                (UINT)hInst, nClassStyle, (UINT)hCursor, (UINT)NULL);
        
        
    // Create the mutex with the class name
        m_hMutex = CreateMutex(NULL, FALSE, m_strClassName);
        
    // Check for errors
        if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
            
    // Reset our mutex handle (just in case)
            m_hMutex = NULL;
            
    // The mutex already exists: an instance is already
            
    // running. Find the app window and bring it to foreground
            HWND hWnd = FindWindowEx(NULL, NULL, m_strClassName, NULL);
            
    if ( hWnd != NULL ) {
                ShowWindow( hWnd, SW_RESTORE );
                BringWindowToTop( hWnd );
                SetForegroundWindow( hWnd );
            }
        
            
    // Return failure
            return FALSE;
        }

        
    // Register the unique window class name
        WNDCLASS wndclass;    
        ZeroMemory(
    &wndclass, sizeof(WNDCLASS));

        wndclass.style 
    = nClassStyle;
        wndclass.lpfnWndProc 
    = AfxWndProc;
        wndclass.hInstance 
    = hInst;
        wndclass.hIcon 
    = hIcon; 
        wndclass.hCursor 
    = hCursor;
        wndclass.hbrBackground 
    = NULL;
        wndclass.lpszMenuName 
    = NULL;
        wndclass.lpszClassName 
    = m_strClassName; // The class name
        
        
    // Use AfxRegisterClass to register the class, exit if it fails
        if(!AfxRegisterClass(&wndclass)) {
            AfxMessageBox( _T(
    "Failed to register window class!"), MB_ICONSTOP | MB_OK );
            
    // Return failure
            return FALSE;
        }

        
    // Return success
        return TRUE;
    }

    CString CSingleInstanceApp::GetClassName() 
    const
    {
        
    return m_strClassName;
    }

    使用:

    调用 #include "SingleInstanceApp.h"

    class CTestSingleApp : public CSingleInstanceApp 继承

    代码
    BOOL CTestSingleApp::InitInstance()
    {
        AfxEnableControlContainer();

        
    //判断单例运行
        BOOL bSingleInstance = CheckSingleInstance(IDR_MAINFRAME);    

        
    // Standard initialization
        
    // If you are not using these features and wish to reduce the size
        
    //  of your final executable, you should remove from the following
        
    //  the specific initialization routines you do not need.

    #ifdef _AFXDLL
        Enable3dControls();            
    // Call this when using MFC in a shared DLL
    #else
        Enable3dControlsStatic();    
    // Call this when linking to MFC statically
    #endif

        
    // Change the registry key under which our settings are stored.
        
    // TODO: You should modify this string to be something appropriate
        
    // such as the name of your company or organization.
        SetRegistryKey(_T("Local AppWizard-Generated Applications"));

        LoadStdProfileSettings();  
    // Load standard INI file options (including MRU)

        
    // Register the application's document templates.  Document templates
        
    //  serve as the connection between documents, frame windows and views.

        CSingleDocTemplate
    * pDocTemplate;
        pDocTemplate 
    = new CSingleDocTemplate(
            IDR_MAINFRAME,
            RUNTIME_CLASS(CTestSingleDoc),
            RUNTIME_CLASS(CMainFrame),       
    // main SDI frame window
            RUNTIME_CLASS(CTestSingleView));
        AddDocTemplate(pDocTemplate);

        
    // Parse command line for standard shell commands, DDE, file open
        CCommandLineInfo cmdInfo;
        ParseCommandLine(cmdInfo);

        
    //保证单例子
        if (!bSingleInstance) {
            AfxMessageBox(
    "此程序已运行!");
            
    return FALSE;
        }

        
    // Dispatch commands specified on the command line
        if (!ProcessShellCommand(cmdInfo))
            
    return FALSE;

        
    // The one and only window has been initialized, so show and update it.
        m_pMainWnd->ShowWindow(SW_SHOW);
        m_pMainWnd
    ->UpdateWindow();

        
    return TRUE;
    }

     代码下载:https://files.cnblogs.com/kenter/TestSingle.zip

  • 相关阅读:
    HDU2034:人见人爱A-B
    Codeup1085: 阶乘的和
    HDU2037:今年暑假不AC
    剑指Offer(Java版)第二十七题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
    剑指Offer(Java版)第二十六题:输入两个整数序列,第一个序列表示栈的压入顺序, 请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不相等。 例如序列1、2、3、4、5是某栈的压栈序列, 序列5、4、3、2、1是该压栈序列对应的一个弹出序列, 但4、3、5、1、2就不可能是该压栈序列的弹出序列。
    剑指Offer(Java版)第二十五题:包含min函数的栈
    剑指Offer(Java版)第二十四题:顺时针打印矩阵
    MongoDB学习笔记10——分片
    MongoDB学习笔记9——复制
    MongoDB学习笔记8——优化
  • 原文地址:https://www.cnblogs.com/kenter/p/1916363.html
Copyright © 2020-2023  润新知