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

Discussion in 'WASM.WIN32' started by Unhandled_Exception, Feb 20, 2008.

  1. Unhandled_Exception

    Unhandled_Exception New Member

    Blog Posts:
    0
    Joined:
    Jul 12, 2006
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    если второй бит в hEvent уже был установлен, то (hEvent | 2) ничего не изменяет.
     
  3. Unhandled_Exception

    Unhandled_Exception New Member

    Blog Posts:
    0
    Joined:
    Jul 12, 2006
    Messages:
    5
    они не равны, забыл добавить, т.е. в первом хендле бит сброшен
     
  4. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    А че бы и нет? А если даже и нет, то после CloseHandle еще раз вызывать CloseHandle скорее ошибочно.
     
  5. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Первые два бита - tag bits, если оба взведены, то считается, что это хендл консоли. А при поиске (lookup) учитываются только старшие 30 бит.