我正在開發一個Windows應用程序。 我想要的是防止此應用程序在單個操作系統中運行多個。 (例如,我們可以同時運行notepad.exe,calc.exe的多個實例...但我不希望這樣) 什麼是最有效的實現方法?(阻止多個實例的進程在同一時間)如何防止在Windows中加載多個程序?
我寧可不使用如檢查過程名稱或共享某些全局文件作爲一個信號的方法......因爲實在是太容易規避
預先感謝您
我正在開發一個Windows應用程序。 我想要的是防止此應用程序在單個操作系統中運行多個。 (例如,我們可以同時運行notepad.exe,calc.exe的多個實例...但我不希望這樣) 什麼是最有效的實現方法?(阻止多個實例的進程在同一時間)如何防止在Windows中加載多個程序?
我寧可不使用如檢查過程名稱或共享某些全局文件作爲一個信號的方法......因爲實在是太容易規避
預先感謝您
這是通常通過互斥體完成。當您的流程啓動時,請致電CreateMutex並檢查返回值。如果它成功了,那麼這是第一次啓動,否則你的進程還有另一個實例存活。你的互斥量應該在Global\
命名空間中。當程序結束運行時,請確保ReleaseMutex。
你在用什麼框架?我假設它是.Net?這是msdn foum發佈的同一篇文章。
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3e139912-45ea-432e-b9e0-e03640c07c9f/
你提到你不想查看當前進程名或使用一個全球性的文件。
鎖住當前可執行
.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值。
這個答案是不是對關於語言/框架的假設做出了假設? – eidsonator
謝謝!但是我的程序是多線程的,我已經在使用互斥鎖作爲關鍵部分管理......這會是一個問題嗎? – daehee