0

我正在创建一个对象,例如 WhaitableTimer,我想与其他进程共享我的对象。

HANDLE htimerProcess = CreateWaitableTimer(NULL, FALSE, L"Time1");  
HANDLE htimerProcess2 = CreateWaitableTimer(NULL, FALSE, L"Time1");
  1. 作为第三个参数,我传递了相同的名称“Time1”,这意味着我正在创建新的内核对象 htimerProcess2 但与 htimerProcess 或 htimerProcess2 具有相同的描述符表只是对现有对象 (htimerProcess) 的引用。
  2. 如何证明 htimerProcess 和 htimerProcess2 是同一个内核对象?我尝试获取他们的地址,但它们不同,或者我可以使用一个内核对象提取进程数。我正在阅读 M.Richter Advanced Win32 Programming
4

2 回答 2

3

从文档到CreateWaitableTimer

如果指定的计时器对象在函数调用之前存在,则函数返回现有对象的句柄,GetLastError 返回ERROR_ALREADY_EXISTS

所以你的问题 #1 的答案是否定的,你没有创建一个新的内核对象——如果两个调用都成功,它们将引用同一个计时器。

如何证明他们是一样的?您可能可以通过调用SetWaitableTimer一个进程并在另一个进程中等待它来做到这一点。

如果您想确保在第二个进程中获得相同的计时器对象,请OpenWaitableTimer改为调用 - 因为只有在计时器已经存在时才会成功。

于 2014-12-02T22:03:10.900 回答
0

根据CreateWaitableTimer的描述,这是可能的:

如果函数成功,则返回值是定时器对象的句柄。如果指定的计时器对象在函数调用之前存在,则函数返回现有对象的句柄,GetLastError 返回 ERROR_ALREADY_EXISTS。

所以你应该检查句柄的值(不是地址)和结果,GetLastError()看看你的实现是否成功。

于 2014-12-02T22:02:56.803 回答