совместное использование объектов ядра между процессами

Я создаю объект, например, 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 Программирование

0

Решение

От документов до CreateWaitableTimer:

Если указанный объект таймера существует до вызова функции,
функция возвращает дескриптор существующего объекта и GetLastError
возвращается ERROR_ALREADY_EXISTS.

Таким образом, ответ на ваш вопрос № 1 — нет, вы не создаете новый объект ядра — если оба вызова завершатся успешно, они будут ссылаться на один и тот же таймер.

Как доказать, что они одинаковы? Вы могли бы сделать это, позвонив SetWaitableTimer в одном процессе, и ожидая его в другом.

Если вы хотите убедиться, что вы получаете тот же объект таймера во втором процессе, вызовите OpenWaitableTimer вместо этого — так как это успешно, только если таймер уже существует.

3

Другие решения

Согласно описанию CreateWaitableTimer, это возможно:

Если функция завершается успешно, возвращаемое значение является дескриптором объекта таймера. Если именованный объект таймера существует до вызова функции, функция возвращает дескриптор существующего объекта, а GetLastError возвращает ERROR_ALREADY_EXISTS.

Таким образом, вы должны проверить значение (не адрес) дескрипторов и результат GetLastError() чтобы увидеть, если ваша реализация будет успешной.

0

По вопросам рекламы [email protected]