Правила копирования. GMEM_FIXED или GMEM_MOVEABLE

Тема в разделе "WASM.BEGINNERS", создана пользователем lord Kelvin, 28 фев 2006.

  1. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    При копировании в буфер обмена необходимо выделить память с помощью GlobalAlloc, в туториалах советуют использовать параметр GMEM_MOVEABLE и преобразовывать затем полученный указатель (GlobalLock, а после GlobalUnlock). Но если выделить память с флагом GMEM_FIXED Необходимость в функциях GlobalLock отпадает GlobalUnlock. В добавок ко всему внешне копирование происходит точно так же.



    Вопрос в том, правилен ли второй способ? И если нет, то почему?
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Зато внутренне может сильно отличаться от ОС, в w2k если ты выделил через GlobalAlloc(GMEM_FIXED) это равнозначно HeapAlloc и работает оно потому, что SetClipboardData сама делает GlobalLock+GlobalUnlock
     
  3. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia


    А если она это делает сама, то можно ли считать второй способ корректным?

    Кстати, большое спасибо за оперативный ответ!
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    lord Kelvin

    внешне копирование происходит точно так же

    В рамках одного процесса?
     
  5. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    Нет, в рамках всей системы (WinXP SP1). В том то и дело.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В 98SE и XP SP2 тоже нормально работает, даже HeapAlloc можно использовать вместо Global

    Так что похоже, что в Win32 без разницы. bogrus прав, SetClipboardData просто вызывает GlobalLock,GlobalUnlock,GlobalFree, а они работают как с moveable, так и с fixed



    PS: ох уж эти GlobalXXX, и чего MS их не выкинет на помойку...

    Просто похоже на отеческую заботу MS о наивных кодерах - поскольку после SetClipboardData блок памяти удаляется, то при при попытке GlobalLock мы получим Null и не сможем работать с удаленным блоком, а вот с fixed - пожалуйста, пока он не затрется в куче другими аллоками может создаться впечатление, что его и не удаляли