Здавалка
Главная | Обратная связь

Именованные объекты



Второй способ, позволяющий нескольким процессам совместно использовать одни и те же объекты ядра, связан с именованием этих объектов. Именование допускают многие (но не все) объекты ядра. Например, следующие функции создают именованные объекты ядра:

HANDLE CreateMutex(

PSECURITY_ATTRIBUTES psa,

BOOL initialOwner,

PCTSTR name);

 

HANDLE CreateEvent(

PSECURITY_ATTRIBUTES psa,

BOOL manualReset,

BOOL initialState,

PCTSTR name);

 

HANDLE CreateSemaphore(

PSECURITY_ATTRIBUTES psa,

LONG initialCount,

LONG maximumCount,

PCTSTR name);

 

HANDLE CreateWaitableTimer(

PSECURITY_ATTRIBUTES psa,

BOOL manualReset,

PCTSTR name);

 

HANDLE CreateFileMapping(

HANDLE hFile,

PSECURITY_ATTRIBUTES psa,

DWORD protect,

DWORD maximumSizeHigh,

DWORD maximumSizeLow,

PCTSTR name);

 

HANDLE CreateJobObject(

PSECURITY_ATTRIBUTES psa,

PCTSTR name);

Последний параметр (name) всех этих функций определяет имя создаваемого объекта. Если вместо строки с именем передать NULL, будет создан безымянный (анонимный) объект. Такие объекты можно разделять либо через наследование (см. предыдущий раздел), либо через дублирование дескриптора (см. следующий раздел).

Имена объектов ядра должны быть уникальными, в противном случае при создании объекта может возникнуть ошибка, особенно, если типы создаваемого и существующего объекта не совпадают. Одно из решений, которое позволяет избежать такой ситуации, является использование GUID (Globally Unique Identifier) в качестве имени объекта.

Перед созданием объекта ядра операционная система сначала проверяет, не существует ли объект с таким именем. Если да, то ядро проверяет тип этого объекта. При совпадении типов, возвращается дескриптор существующего объекта, в противном случае – код ошибки.

Если объект уже существует, можно попытаться получить к нему доступ, используя соответствующую Open-функцию (функцию открытия):

HANDLE OpenMutex(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name);

 

HANDLE OpenEvent(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name);

 

HANDLE OpenSemaphore(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name),

 

HANDLE OpenWaitableTimer(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name);

 

HANDLE OpenFileMapping(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name);

 

HANDLE OpenJob0bject(

DWORD desiredAccess,

BOOL inheritHandle,

PCTSTR name);

Главное отличие между вызовом Create- и Open-функций в том, что при отсутствии указанного объекта Create-функция создает его, а Open-функция просто уведомляет об ошибке. Но обе функции в случае успеха увеличивают счетчик числа пользователей объекта на 1.

Именованные объекты часто применяются для того, чтобы не допустить запуска нескольких экземпляров одного приложения. Для этого с помощью одной из Create-функций создается некий именованный объект (какой именно – не имеет ни малейшего значения) и сразу после этого вызовом функции GetLastError проверяется наличие ошибки, наличие которой говорит о том, что экземпляр приложения уже выполняется:

void main()

{

HANDLE h = CreateMutex(NULL, false,

"{A141893E-4422-4C4B-A36D-F5857CFCD26A}");

 

// Если при создании произошла ошибка, значит экземпляр

// приложения уже выполняется

if (GetLastError() == ERROR_ALREADY_EXISTS)

{

return;

}

 

...

 

CloseHandle(h);

}







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.