Войти
ФлеймФорумПрограммирование

Гадский clipboard падает. (2 стр)

Страницы: 1 2 3 4 5 Следующая »
#15
17:27, 20 фев. 2020

Delfigamer
> HANDLE bufhandle = GlobalAlloc(GMEM_MOVEABLE, text.size() + 1);
> {
> void* bufptr = GlobalLock(bufhandle);
> memcpy(bufptr, text.data(), text.size() + 1);
> GlobalUnlock(bufhandle);
> }
> SetClipboardData(CF_TEXT, bufhandle);
Вот 100% рабочий вариант.

  OpenClipboard(0);
  EmptyClipboard();
  HGLOBAL hr = GlobalAlloc(GMEM_MOVEABLE, 1024);

  void * bufptr = GlobalLock(hr);
  memcpy(bufptr, "asdf", 5);
  SetClipboardData(CF_TEXT, hr);
  GlobalUnlock(hr);

  GlobalFree(hr);
  CloseClipboard();

#16
17:28, 20 фев. 2020

programina
> GlobalFree(hr);
Нет.

#17
17:28, 20 фев. 2020

programina
>Вот 100% рабочий вариант.

Как уже писали, GlobalFree надо делать только в случае ошибки SetClipboardData

#18
17:31, 20 фев. 2020

ronniko

The following values are obsolete, but are provided for compatibility with 16-bit Windows. They are ignored:

*    GMEM_DDESHARE


Лол, он на самом деле вообще ничего не делает.
#19
17:31, 20 фев. 2020

CD
> GlobalFree надо делать только в случае ошибки SetClipboardData
Это утечка памяти!!!

#20
(Правка: 17:35) 17:34, 20 фев. 2020
The following values are obsolete, but are provided for compatibility with 16-bit Windows. They are ignored:
  •     GMEM_DDESHARE

  • Лол, он на самом деле вообще ничего не делает.

    А как вообще оно тогда работало 1 или 2 раза у меня ?!! И в блокнот вставляло текстовую матрицу 4х4

    Ржака.
    Долбаный Микрософт.

    #21
    17:35, 20 фев. 2020

    ronniko
    > А как вообще оно тогда работало 1 или 2 раза у меня ?!!
    проблема в fasm'е, у меня работает с GMEM_DDESHARE

    #22
    (Правка: 17:39) 17:36, 20 фев. 2020

    programina
    Это был бы double free, потому что после SetClipboardData операционная система сама освободит память при следующем вызове EmptyClipboard, где бы он не произошёл - или в твоём же процессе, или в каком-нибудь фотошопе.
    "Был бы", потому что винда должна сразу обнаружить косяк в момент вызова GlobalFree на невалидном дескрипторе и вернуть ошибку.

    > проблема в fasm'е, у меня работает с GMEM_DDESHARE
    На всякий случай, напомню:

    If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.

    То есть, GMEM_DDESHARE - это нооп и не нужен, а вот GMEM_MOVEABLE - присутствовать обязан, и без него работа не гарантируется.
    Например, я предполагаю, без GMEM_MOVEABLE буфер обмена может внезапно самоочиститься после закрытия программы-источника (если до этого момента вдруг работал). Или выдать синий экран, но после третьего сервиспака такого быть уже не должно.

    #23
    (Правка: 17:44) 17:39, 20 фев. 2020

    programina
    У меня тоже при GMEM_DDESHARE адрес есть, а не ноль.
    И это звучит очень странно в таком свете.

    The following values are obsolete, but are provided for compatibility with 16-bit Windows. They are ignored:
  •     GMEM_DDESHARE

  • Облажался Микрософт.

    Я использовал GMEM_DDESHARE в нескольких своих 32 битных программах. И везде тоже работало.
    Делал редактор. И там много раз копировал и вставлял в Win ClipBoard и крашей не было.


    Сейчас у меня треды, DX12\Reset CmdAllocator и Reset cmdList и еще ClipBoard.
    И вот тут проявился краш на ClipBoard

    #24
    (Правка: 17:45) 17:44, 20 фев. 2020

    ronniko
    > У меня тоже при GMEM_DDESHARE адрес есть, а не ноль.
    > Облажался Микрософт.
    Ч И Т А Й Т Е    Д О К У М Е Н Т А Ц И Ю ! ! !
    Ааааааа!
    https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-win… e-globalalloc

    DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
      UINT   uFlags,
      SIZE_T dwBytes
    );
    uFlags
    The memory allocation attributes. If zero is specified, the default is GMEM_FIXED.

    GMEM_FIXED
    0x0000

      Allocates fixed memory. The return value is a pointer.


    GlobalAlloc(GMEM_DDESHARE, size) равнозначно GlobalAlloc(0, size) и работает так же, как malloc(size).
    Но при этом, полученную память нельзя использовать с буфером обмена.
    Чтобы записать данные в буфер обмена, нужно обязательно брать дескриптор через GlobalAlloc(GMEM_MOVEABLE, size) и писать через GlobalLock.
    #25
    (Правка: 17:51) 17:48, 20 фев. 2020
    Ч И Т А Й Т Е    Д О К У М Е Н Т А Ц И Ю ! ! !

    Да. Я понял.
    Спасибо за помощь.
    + Показать
    #26
    17:48, 20 фев. 2020

    Delfigamer
    > Ч И Т А Й Т Е    Д О К У М Е Н Т А Ц И Ю ! ! !
    Изображение

    #27
    17:51, 20 фев. 2020

    Delfigamer
    > Чтобы записать данные в буфер обмена, нужно обязательно брать дескриптор через
    > GlobalAlloc(GMEM_MOVEABLE, size) и писать через GlobalLock.
    У меня работает

    HGLOBAL hr = GlobalAlloc(GMEM_DDESHARE, 1024);
    наверно из-за mingw
    #28
    17:52, 20 фев. 2020

    Misanthrope
    Да не, тут целый балаган из целых двоих оптимистичных разработчиков.
    И заварка лежит снаружи пакетика. Баг на производстве. Упс.

    #29
    17:54, 20 фев. 2020

    Из этой темы я могу сделать однозначный вывод: надо писать на MINGW, а не на FASM и VisualC++

    Страницы: 1 2 3 4 5 Следующая »
    ФлеймФорумПрограммирование