c++ 如何在进程之间共享内核对象,例如Waitable Timers?

cqoc49vn  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在创建一个对象,例如Waitable Timer,我想与另一个进程共享我的对象:

// In process 1:
HANDLE hTimerProcess1 = CreateWaitableTimer(NULL, FALSE, L"Time1");
// In process 2:
HANDLE hTimerProcess2 = CreateWaitableTimer(NULL, FALSE, L"Time1");

1.作为第三个参数,我传递了相同的名称"Time1",这是否意味着我正在创建一个新的内核对象hTimerProcess2,但使用与hTimerProcess1相同的描述符表条目,或者hTimerProcess2只是对现有对象(hTimerProcess1)的引用?
1.如何证明hTimerProcess1hTimerProcess2是同一个内核对象?我尝试获取它们的地址,但它们是不同的。
我在阅读里希特先生的“高级Win32编程”

tgabmvqs

tgabmvqs1#

从文档到CreateWaitableTimer
如果指定的定时器对象在函数调用之前已存在,则函数返回现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS
因此,问题1的答案是否定的,您不会创建新的内核对象--如果两个调用都成功,它们将引用同一个计时器。
如何证明它们是相同的呢?您可以通过在一个进程中调用SetWaitableTimer,并在另一个进程中等待它来实现这一点。
如果您想额外确保在第二个进程中获得相同的计时器对象,则调用OpenWaitableTimer-因为只有在计时器已经存在时,此操作才会成功。

ctehm74n

ctehm74n2#

根据CreateWaitableTimer的描述,这是可能的:
如果函数成功,则返回值为定时器对象的句柄。如果指定的定时器对象在函数调用之前就存在,则函数返回现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。
因此,您应该检查句柄的值(而不是地址)和GetLastError()的结果,以查看您的实现是否成功。

相关问题