2014-12-02 86 views
0

我正在創建一個對象,例如WhaitableTimer,並且我想與其他進程共享我的對象。在進程之間共享內核對象

HANDLE htimerProcess = CreateWaitableTimer(NULL, FALSE, L"Time1"); 
HANDLE htimerProcess2 = CreateWaitableTimer(NULL, FALSE, L"Time1"); 
  1. 作爲第三paramater我傳遞了同一個名字「時間1」,是不是說我正在創建新的內核對象htimerProcess2但具有相同的描述符表作爲htimerProcess或htimerProcess2只是給一個參考現有對象(htimerProcess)。
  2. 如何證明htimerProcess和htimerProcess2是同一個內核對象?我試着讓他們的地址,但他們是不同的或以某種方式我可以拉一個內核對象的進程數量。 我讀M.Richter高級Win32編程
+0

與您的問題無關,但您知道該書的最近版本? Windows通過C/C++ – eurotrash 2014-12-02 22:13:38

+0

我正在閱讀第4版。 – 2014-12-02 22:21:10

回答

3

從文檔到CreateWaitableTimer

如果命名計時器對象的函數調用之前存在, 函數返回一個句柄到現有的對象,並且GetLastError 回報ERROR_ALREADY_EXISTS

所以回答你的問題#1不,你不創建一個新的內核對象 - 如果兩次調用都成功,他們會指向同一個計時器。

如何證明它們是一樣的?你可以通過在一個進程中調用SetWaitableTimer並在另一個進程中等待。

如果你想額外確保您獲得在第二過程中的同一個定時器對象,調用OpenWaitableTimer代替 - 因爲如果計時器已經存在,這只是成功。

+0

如何在另一個進程中正確調用SetWaitableTimer函數? – 2014-12-02 22:10:46

+0

@OlexanderHaliy在該過程中從CreateWaitableTimer返回的句柄上調用它。每個進程都有一個唯一的句柄,但句柄指向同一個內核對象。 – 2014-12-02 22:12:49

+0

好吧,我明白,手柄是不同的,但他們指的是相同的對象,所以如果我通過一個句柄的SetWaitableTimer我會激活計時器,但我怎麼能用它在另一個證明他們是相同的 – 2014-12-02 22:18:37

0

CreateWaitableTimer的描述,這是可能的:

如果函數成功,返回值是一個句柄定時器對象。如果指定的定時器對象在函數調用之前存在,則函數返回現有對象的句柄,並且GetLastError返回ERROR_ALREADY_EXISTS。

因此,您應該檢查句柄的值(而不是地址)以及GetLastError()的結果以查看您的實現是否成功。