如何防止Windows中的多个程序加载?

时间:2013-06-04 17:18:42

标签: windows process

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

我宁愿不使用检查进程名称或共享某个全局文件等方法作为信号......因为它太容易规避

提前谢谢

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您使用的是哪种框架?我假设它是.Net?这是msdn foum关于同一件事的帖子。

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

答案 2 :(得分: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值。