在进程之间共享内核对象

时间:2014-12-02 21:49:02

标签: c++ winapi windows-kernel

我正在创建一个对象,例如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

2 个答案:

答案 0 :(得分:3)

从文档到CreateWaitableTimer

  

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

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

如何证明它们是一样的?您可以通过在一个进程中调用SetWaitableTimer并在另一个进程中等待它来完成此操作。

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

答案 1 :(得分:0)

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

  

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

因此,您应该检查句柄的值(而不是地址)和GetLastError()的结果,看看您的实现是否成功。