我正在开发一个Windows应用程序。 我想要的是防止这个应用程序在单个操作系统中运行多个。 (例如,我们可以同时运行notepad.exe,calc.exe的多个实例......但我不希望这样) 实现这个的最有效方法是什么?(防止多个进程同时运行)
我宁愿不使用检查进程名称或共享某个全局文件等方法作为信号......因为它太容易规避
提前谢谢
答案 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值。