2014-12-02 49 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()的结果以查看您的实现是否成功。