Загадка с хендлами

Тема в разделе "WASM.WIN32", создана пользователем Unhandled_Exception, 20 фев 2008.

  1. Unhandled_Exception

    Unhandled_Exception New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    5
    Всем привет.

    Делаем так:

    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    HANDLE hEvent1 = (HANDLE)((DWORD)hEvent | 2);
    CloseHandle(hEvent1);

    CloseHandle возвращает TRUE.

    Делаем так:

    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    HANDLE hEvent1 = (HANDLE)((DWORD)hEvent | 2);
    CloseHandle(hEvent1);
    CloseHandle(hEvent);

    Первый CloseHandle возвращает TRUE. Второй завершается неудачей, код ошибки: невалидный хендл.

    Выходит, что хендлы определяются с точностью до второго бита??...
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    если второй бит в hEvent уже был установлен, то (hEvent | 2) ничего не изменяет.
     
  3. Unhandled_Exception

    Unhandled_Exception New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    5
    они не равны, забыл добавить, т.е. в первом хендле бит сброшен
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    А че бы и нет? А если даже и нет, то после CloseHandle еще раз вызывать CloseHandle скорее ошибочно.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Первые два бита - tag bits, если оба взведены, то считается, что это хендл консоли. А при поиске (lookup) учитываются только старшие 30 бит.