2014-12-02 1 views
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 Программирование
+0

Не связанный с вашим вопросом, но вы знаете, что есть более свежие издания этой книги? Windows через C/C++ – eurotrash

+0

Я читаю 4-е издание. –

ответ

3

Из документов в CreateWaitableTimer:

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

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

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

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

+0

как правильно вызвать функцию SetWaitableTimer в другом процессе? –

+0

@OlexanderHaliy Назовите это на ручке, которую вы возвращаете из CreateWaitableTimer в этом процессе. Каждый процесс будет иметь уникальный дескриптор, но дескрипторы относятся к одному и тому же объекту ядра. –

+0

ok Я понял, что ручки разные, но они ссылаются на один и тот же объект, поэтому, если я передаю дескриптор SetWaitableTimer, я активирую таймер, но как я могу использовать его на другом, чтобы доказать, что они одинаковые –

0

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

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

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