如何限制对 Visual c + + 中的一个实例的 32-位应用程序

文章翻译 文章翻译
文章编号: 243953 - 查看本文应用于的产品
注意Microsoft Visual c + + 2005年、 Microsoft Visual c + +.net 2003年和 Microsoft Visual c + +.net 2002年支持托管的代码模型所提供的 Microsoft.net 框架和非托管本机 Windows 代码模型。本文中的信息仅适用于非托管的 Visual c + + 代码。
展开全部 | 关闭全部

概要

本文讨论了如何限制到一个实例应用程序。在这篇文章中使用该方法不依赖于任何创建的窗口。因此,该方法可用于限制应用程序可以在 Visual c + + 中开发的一个实例。这包括控制台应用程序、 WinCE 应用程序、 对话框基于框中的应用程序、 没有一个的图形用户界面的应用程序和其他应用程序。

更多信息

在这篇文章中使用的方法是在 WinMain 主题下在 MSDN 中描述的。它使用 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. 单击 项目,,然后再单击 ProjectName 属性

      注意ProjectName 是项目的名称的占位符。
    2. 展开 配置属性,然后单击 常规
    3. 在右窗格中单击以选中 公共语言运行库支持、 $ 旧语法 (/ clr:oldSyntax)支持公共语言运行库 中项目设置。
    4. 单击 应用,然后单击 确定
    有关公共语言运行库支持编译器选项的详细信息,请访问下面的 Microsoft 开发人员网络 (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() 函数。
  5. 全局 CLimitSingleInstance 实例的构造函数传递一个唯一的名称。建议使用唯一的名称,以便另一个应用程序可能正在使用此文章执行重复检查时不会产生冲突。获取一个唯一的名称,没有其他人所具有的一种简单方法是使用 GUIDGEN 工具。若要访问工具,单击 开始、 单击 运行,然后键入 GUIDGEN。如果由于某种原因您不具有该工具,该工具可作为在 MSDN 中的一个示例。类型 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. 在您的输入点函数、 全局 CLimitSingleInstance 类的实例上调用 IsAnotherInstanceRunning() 方法和检查返回值。如果该函数返回真则返回从入口点函数。否则,继续进行正常的执行。

    在 MFC 应用程序中您可以执行某些操作类似于以下内容:
    #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.
    }
    						
    在一个控制台应用程序,您可以执行某些操作类似于以下内容:
    #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.
    }
    						
    入了 Win32 SDK 应用,您可以执行类似以下:
    #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.
    }
    						
之后这些步骤应用程序将不允许在同一时间保持活动状态的多个实例。

注意在运行终端服务下,不添加 Global\ 将保证每个终端服务会话的一个实例。
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
添加"Global\"是否存在的应用程序在一台计算机上只有一个实例将保证。这可应用于终端服务正在运行或不。

参考

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
238100如何限制到单个实例上 WinCE 的 32 位 MFC SDI 应用程序

属性

文章编号: 243953 - 最后修改: 2006年1月9日 - 修订: 7.0
这篇文章中的信息适用于:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 标准版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 4.2 专业版
  • Microsoft Visual C++ 4.2 企业版
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.0 标准版
关键字:?
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 243953
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

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