-1

我正在开发一个 Windows 应用程序。我想要的是防止这个应用程序在单个操作系统中运行多个。(例如,我们可以同时运行notepad.exe、calc.exe的多个实例......但我不想要这个)实现这个的最有效方法是什么?(防止多个进程实例同时运行)

我宁愿不使用检查进程名称或共享一些全局文件作为信号之类的方法......因为它太容易绕过

先感谢您

4

3 回答 3

0

你用的是什么框架?我假设它是.Net?这是来自 msdn foum 的关于同一件事的帖子。

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3e139912-45ea-432e-b9e0-e03640c07c9f/

于 2013-06-04T17:24:41.403 回答
0

这通常使用互斥锁来完成。当您的进程启动时,您调用CreateMutex并检查返回值。如果成功,则这是第一次启动,否则您的进程的另一个实例还活着。您的互斥锁应该在Global\命名空间中。当你的程序完成运行时,还要确保ReleaseMutex 。

于 2013-06-04T17:21:31.187 回答
0

您提到您不想检查当前进程名称或使用全局文件。

锁定当前可执行文件

.NET 示例代码:

        System.IO.File.Open(
            System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName,
            System.IO.FileMode.Open,
            System.IO.FileAccess.Read,
            System.IO.FileShare.None);

FileShare.None 阻止任何其他进程(如 Windows 资源管理器)执行文件,直到应用程序关闭或文件句柄(返回的对象)被显式关闭。

全局互斥体

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411%28v=vs.85%29.aspx

如果互斥锁是命名互斥锁并且该对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError 返回 ERROR_ALREADY_EXISTS,忽略 bInitialOwner,并且不授予调用线程所有权。但是,如果调用者的访问权限有限,则该函数将失败并显示 ERROR_ACCESS_DENIED 并且调用者应使用 OpenMutex 函数。

全局互斥锁是最简单的方法。为了澄清另一个答案,您不仅要检查返回值,还要检查 GetLastError 值。

于 2013-06-04T17:42:03.627 回答