2014-02-15 41 views
0

OpenMutex()總是返回不同的句柄地址是否正常?該文件說如果成功則返回HANDLE,否則返回NULL指定互斥鎖的不同HANDLE結果

OpenMutex的每個實例返回不同的手柄......

m_logMutex被定義爲static HANDLE

m_logMutex = OpenMutex(SYNCHRONIZE, FALSE, LOGMUTEX); 
    if(m_logMutex == NULL) { 
     m_logMutex = CreateMutex(NULL, FALSE, LOGMUTEX); 
    } 

此外,由於這是命名爲,爲什麼連一個靜態的處理?這是一個程序的一部分,可以將來自不同進程的數千個事務歸檔到同一個數據庫中。我發現我的靜態HANDLE被改變成不同的手柄並造成WAIT_FAILED錯誤

+5

是的,沒關係。甚至可以同時對同一內核對象使用2+處理(請參閱'DuplicateHandle' API)。 –

+1

相關:也許我已經在Unix世界很久了,但我記得你可以簡單地使用'CreateMutex',並且你可以通過檢查'GetLastError()來「知道」它是否打開了一個以前打開過的相同名稱的互斥體。對於'E_ALREADY_EXISTS',如果知道你是否是創建它的人很重要。換句話說,這裏的'如果OpenMutex()'邏輯似乎沒有必要。 – WhozCraig

+0

@WhozCraig是的。我注意到'CreateMutex()'具有相同的行爲,但我擔心每次看到新的句柄。 – kenyu73

回答

1

有一個在這裏細微的差別:調用不返回手柄。電話回覆a句柄。

只要檢索到的句柄允許你做你要求的(即安全許可),一切都很好。只是不要假設沒有明確記錄的手柄。

此外,由於這是命名的,爲什麼即使有一個靜態HANDLE?這是一個程序的一部分,可以將來自不同進程的數千個事務歸檔到同一個數據庫中。

static引用您的變量。它不是手柄本身的屬性。

我發現我的靜態HANDLE被改變成不同的手柄並造成WAIT_FAILED錯誤

只要你不關閉句柄(也許正確DuplicateHandle()在需要的地方),這應該不會發生。如果你CloseHandle()它,它當然會失效。如果您在程序的各個部分之間傳遞句柄,出於相同的原因,應該注意句柄的所有權。如果您在進程之間傳遞句柄,則必須調用DuplicateHandle()

除此之外,它非常簡單。手柄沒有黑魔法。

+0

我注意到如果一個輔助進程調用它(通過包含.cpp),我的靜態全局HANDLE'CreateMutex'調用返回NULL。我必須將整個HANDLE移動到事務函數,並調用'OpenMutex/CreateMutex'來獲得非NULL句柄。我剛剛評論了全局靜態互斥,我的測試看起來很有前途。 – kenyu73