仅启动一个基于 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 对话框的应用程序实例的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 中禁用基于对话框的 MFC 应用程序的自动关闭?