我正在创建一个对象,例如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.如何证明hTimerProcess1
和hTimerProcess2
是同一个内核对象?我尝试获取它们的地址,但它们是不同的。
我在阅读里希特先生的“高级Win32编程”
2条答案
按热度按时间tgabmvqs1#
从文档到
CreateWaitableTimer
:如果指定的定时器对象在函数调用之前已存在,则函数返回现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。
因此,问题1的答案是否定的,您不会创建新的内核对象--如果两个调用都成功,它们将引用同一个计时器。
如何证明它们是相同的呢?您可以通过在一个进程中调用
SetWaitableTimer
,并在另一个进程中等待它来实现这一点。如果您想额外确保在第二个进程中获得相同的计时器对象,则调用
OpenWaitableTimer
-因为只有在计时器已经存在时,此操作才会成功。ctehm74n2#
根据CreateWaitableTimer的描述,这是可能的:
如果函数成功,则返回值为定时器对象的句柄。如果指定的定时器对象在函数调用之前就存在,则函数返回现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。
因此,您应该检查句柄的值(而不是地址)和
GetLastError()
的结果,以查看您的实现是否成功。