仅启动一个基于 MFC 对话框的应用程序实例

Posted

技术标签:

【中文标题】仅启动一个基于 MFC 对话框的应用程序实例【英文标题】:Start only one instance of MFC Dialog Based Application 【发布时间】:2009-05-21 07:16:06 【问题描述】:

我创建了一个基于 MFC 对话框的应用程序。

我启动了应用程序,它运行良好。现在,当它运行时,我再次启动应用程序,它启动了它的另一个实例。

但是,我不想要他的行为;如果应用程序已经在运行,我想阻止它的新实例被创建。

请给我密码。

【问题讨论】:

Googling MFC Single Instance 揭示codeproject.com/KB/threads/singleinstancemfc.aspx 最简单的方法是检查您的 Main() 是否与您的程序同名的进程已经在运行,如果是则退出。谷歌搜索将很快找到相关代码,例如This forum post should be suitable 【参考方案1】:

在调用应用程序对话框类之前,请尝试在 main 中调用以下函数。如果它返回 False 则不要创建对话框而是退出。

BOOL init()

   HANDLE mutex = CreateMutex(NULL, FALSE, "mutexname");
   if(mutex == NULL)
   
      return FALSE;
   

   if (GetLastError() == ERROR_ALREADY_EXISTS)
    
       /* You only need the message box if you wish to notify the user 
          that the process is running*/
       MessageBox("Another instance is already running.");
       return FALSE;
   

   return TRUE;
 

确保mutexname是唯一的,使用VS生成GUID并以字符串形式作为mutex名使用。

【讨论】:

什么是互斥名,我不明白请你举个例子 "mutexname" 是您提供的字符串值。您需要在实际代码中替换它。字符串需要尽可能唯一。最简单的方法是使用 Visual Studio 中的 GUID 生成器为您提供 GUID 字符串,例如“D07E6400-40D6-493a-8470-542A14102CB6”。用那个替换 mutexname。 啊,我看到您使用的是 VS 6 - 我不记得它是否有 GUID 生成器,在这种情况下使用我上面提供的那个。 不幸的是,我使用的是 VS2008,我不记得 VS6 是否有创建 GUID 的工具。对我来说,我可以在“工具”菜单下选择“创建 GUID”,然后选择注册表版本并将其复制给我放在上面的字符串。您不必为互斥体名称使用 GUID,但它是确保字符串唯一的可靠方法。如果您愿意,可以使用任何字符串,例如“我喜欢土豆泥和肉汁香肠”,直到你遇到喜欢香肠、土豆泥和肉汁的其他人之前,它仍然有效。 :) 快速的 Google 搜索会为您提供guidgenerator.com,这是一个可以生成任意数量 GUID 的站点。或者你可以使用我刚刚为你生成的这个:98bc9b99-a12f-4c61-b840-55e005f8b014

以上是关于仅启动一个基于 MFC 对话框的应用程序实例的主要内容,如果未能解决你的问题,请参考以下文章

MFC编程入门之十一(对话框:模态对话框及其弹出过程)

设置基于MFC对话框的应用程序窗口的位置

如何在 Visual Studio 中禁用基于对话框的 MFC 应用程序的自动关闭?

(转载)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)

VS2010/MFC编程(对话框:模态对话框及其弹出过程)

怎么在基于对话框的MFC程序中实现多线程?