Инструкции по ограничению 32-разрядных приложений на одном экземпляре в Visual C++

Переводы статьи Переводы статьи
Код статьи: 243953 - Vizualiza?i produsele pentru care se aplic? acest articol.
Примечание.Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 и Microsoft Visual C++ .NET 2002 поддерживает модель управляемого кода, который поставляется с Microsoft .NET Framework и неуправляемым собственной модели кода Microsoft Windows. Данные этой статьи относятся только к нерегулируемому программному коду Visual C++..
Развернуть все | Свернуть все

Аннотация

В данной статье описывается ограничение для одного экземпляра приложения. Метод, который используется в данной статье не зависит от любого создания окон. Таким образом этот метод может использоваться для ограничения приложения одного экземпляра, которые разработаны в Visual C++. К ним относятся консольные приложения, WinCE приложений, приложений на основе поля диалогового окна приложения без использования графического интерфейса пользователя и других приложений.

Дополнительная информация

Метод, который используется в данной статье, помечается, описанного в библиотеке MSDN в разделе WinMain. Он используетCreateMutexфункция для создания именованного мьютекса, которые могут быть возвращены процессов. Вместо дублирования для всех приложений, которые будут использоваться как отдельный экземпляр того же кода, код, который необходимо иметь находится в обертку класса C++, который может использоваться для каждого приложения.

Чтобы использовать эту функцию, выполните следующие действия.
  1. Создайте новый файл заголовка с именем LimitSingleInstance.h, а затем добавить его к проекту.
  2. Скопируйте следующий код в файл LimitSingleInstance.h, а затем сохраните файл:
    #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
    					
    Примечание.В Visual C++ 2005, необходимо добавить параметр компилятора поддержки общего языка во время выполнения (/ CLR: oldSyntax) для успешной компиляции предыдущего примера кода. Чтобы добавить параметр компилятора поддержки общего языка во время выполнения, выполните следующие действия.
    1. затем –Projectи выберите командуИмя_проектаСвойства.

      Примечание.Имя_проекта— Это имя проекта.
    2. expandСвойства конфигурациии выберите командуОбщие.
    3. В правой области щелкнитеОбщей языковой среды выполнения поддержки, старый синтаксис (/ CLR: oldSyntax)В диалоговом окнеПоддержка общей языковой среды выполненияпараметры проекта.
    4. затем –Применениеи выберите командуOk..
    Для получения дополнительных сведений о параметрах компилятора поддержки общего языка во время выполнения посетите следующий веб-узел Microsoft Developer Network (MSDN):
    http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx
  3. # include файла LimitSingleInstance.h, где находится точка входа программы. Если для использования в приложении MFC, это файл, гдеInitInstance()функции приложения находится. В Win32 SDK приложение, это местоWinMain()функция находится. В консольном приложении, где этоMain()функция находится.
    #include "LimitSingleInstance.H"
    					
  4. Создайте глобальный экземплярCLimitSingleInstanceКласс перед функцию точки входа. Если это используется в приложении MFC, создать экземпляр доInitInstance()function:.
  5. Передать конструктору глобальных уникальное имяCLimitSingleInstanceЭкземпляр:. Рекомендуется использовать уникальное имя, что другое приложение, которое может использоваться в данной статье, не будут конфликтовать при выполнении проверки дубликатов. Использование средства GUIDGEN является простой способ получить уникальное имя, которое никто не будет. Чтобы использовать программу, нажмите кнопкуSTART ::затем –Выполнить, а затем введитеGUIDGEN. Если по какой причине нет средства, средство предоставляется в качестве примера в библиотеке MSDN. TYPE :GUIDGENв индексе MSDN для его поиска. Убедитесь, что используетсяобновления.параметр GUIDGEN инструмента.
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    // Change what is passed to constructor. GUIDGEN Tool may be of help.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
    					
  6. В функции точки входа, вызовIsAnotherInstanceRunning()method on the global instance of theCLimitSingleInstanceclass and check the return value. If the function returns TRUE, return from the entry point function. Otherwise, continue execution as normal.

    In an MFC Application, you can do something similar to the following:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{05CA3573-B449-4e0b-83F5-7FD612E378E9}"));
    
    BOOL CSingleInstDlg5App::InitInstance()
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    
    //Rest of code.
    }
    						
    In a Console Application, you can do something similar to the following:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{9DA0BEED-7248-450a-B27C-C0409BDC377D}"));
    
    int main(int argc, char* argv[])
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return 0;
    //Rest of code.
    }
    						
    In a Win32 SDK Application, you can do something similar the following:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{2194ABA1-BFFA-4e6b-8C26-D191BB16F9E6}"));
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int cmdShow)
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    //Rest of code.
    }
    						
After following these steps, the application will not allow more than one instance to remain active at the same time.

Примечание.When running under Terminal Services, not adding Global\ will guarantee one instance per Terminal Services session.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
Adding "Global\" will guarantee that there is only one instance of the application on a computer. This applies whether Terminal Services is running or not.

Ссылки

Для получения дополнительных сведений обратитесь к следующей статье Базы Знаний Майкрософт::
238100How to limit 32-bit MFC SDI applications to a single instance on WinCE

Свойства

Код статьи: 243953 - Последний отзыв: 18 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
Ключевые слова: 
kbinfo kbhowto kbuidesign kbmt KB243953 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:243953

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com