2012-03-12 61 views
-3

我正在使用互斥對象來強制執行單實例。 贏了7我的代碼不起作用。可能是什麼原因? 代碼是在這裏使用互斥鎖來強制執行單實例

//Test for another instance 
HANDLE hMutex = CreateMutex(NULL, TRUE, 
     _T("Global\\DFFDFD-C1733E55-A6FD-47D5-8638-053E938E08B8")); 
    if (hMutex) 
    { 
     if(GetLastError() == ERROR_ALREADY_EXISTS) 
     { 
      DebugWrite(_T("Another instance of application running. Aborting.\n")); 
      MessageBeep(0xFFFFFFFF); 
      ShowErrorMessage(IDS_ANOTHER_INSTANCE_RUNNING_ABORTING); 
      CloseHandle(hMutex); 
      return 0; 
     } 
    } 
+11

定義「不能工作」 – 2012-03-12 00:10:05

+0

不工作意味着互斥鎖創建了多個因此應用程序可能會同時打開多次 – SparcU 2012-03-12 07:20:26

+0

您如何知道互斥鎖已創建?你從不檢查'CreateMutex'的返回值。 – 2012-03-12 08:41:36

回答

4

當您互斥對象名稱前將全球\,這意味着這個互斥是計算機上的所有用戶訪問。

雖然如果您使用的是vista或win7計算機,仍然會出現問題,因爲高級應用程序創建的互斥鎖無法訪問非高級應用程序。

爲了解決這個問題,您可以指定一個SecurityDescriptor作爲createmutex函數的第一個參數,允許訪問每個人。

1

實際上這個代碼也不起作用,因爲CreateMutex將返回不爲NULL的句柄,即使它已經存在。

MSDN

如果互斥鎖是一個名爲互斥而這個函數調用之前存在的對象,返回值是一個句柄現有對象,GetLastError返回ERROR_ALREADY_EXISTS」

此代碼首先檢查hMutex是否爲NULL

+0

我使用這個代碼來強制單個實例運行。在我將安全標識符添加到代碼後,它工作正常。但是,當我無法創建或訪問互斥鎖,因此句柄爲零的情況實際上是另一個錯誤。我改變了代碼來照顧這個。 – SparcU 2014-04-17 12:38:33