MFC: How to limit application instance or not allow multiple instance of the same application

1. Create the class

#ifndef LimitSingleInstance_H
#define LimitSingleInstance_H

#include<windows.h>

//This code is from Q243953 in case you lose the article and wonder
//where this code came from.
class CLimitSingleInstance
{
protected:
  DWORD  m_dwLastError;
  HANDLE m_hMutex;

public:
  CLimitSingleInstance(TCHAR *strMutexName)
  {
    //Make sure that you use a name that is unique for this application otherwise
    //two apps may think they are the same if they are using same name for
    //3rd parm to CreateMutex
    m_hMutex = CreateMutex(NULL, FALSE, strMutexName); //do early
    m_dwLastError = GetLastError(); //save for use later...
  }
 
  ~CLimitSingleInstance()
  {
    if (m_hMutex)  //Do not forget to close handles.
    {
       CloseHandle(m_hMutex); //Do as late as possible.
       m_hMutex = NULL; //Good habit to be in.
    }
  }

  BOOL IsAnotherInstanceRunning()
  {
    return (ERROR_ALREADY_EXISTS == m_dwLastError);
  }
};
#endif

2. Add the file in the header to where the app instance is located

#include "SingleLimitInstance.h"

3. Instantiate an instance of the class

CLimitSingleInstance g_SingleInstanceObj(TEXT("MY_UNIQUE_APPLICATION_STRING"));
CxxxApp theApp;

4. Inside the xxx::InitInstance() function add the code before anything else

BOOL xxx::InitInstance()
{
  if (g_SingleInstanceObj.IsAnotherInstanceRunning())
       return FALSE;
//more codes after this...
}


That's it!



Comments

Popular posts from this blog

Creating tray application and popup context menu in Windows

How to statically link applications to wxWidgets via Visual Studio 2008 and in Linux

How to put an image to wxPanel using wxWidgets