Ошибка при записи строки в clipboard

Тема в разделе "WASM.WIN32", создана пользователем clubnr, 7 июл 2006.

  1. clubnr

    clubnr New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2006
    Сообщения:
    11
    Адрес:
    Russia
    Просьба подсказать, где ошибка в этом примере на запись строки в clipboard.
    Все сделано, как в справке. При первом обращении к CopyStringToClipboard
    GlobalUnlock выдает ошибку (остальные win api не выдают), при расшифровке которой
    через getlasterror получаем строку, что "операция успешно завершена". В буфер записывается aaa.
    При втором обращении к процедуре кроме этого SetClipboardData и GlobalFree выдают ошибку
    "неверный дескриптор". Буфер пуст.
    Реальная программка в GUI и там в вызове OpenClipboard(0) вместо 0 ставится хендл окна програмы,
    но ошибки те же самые.
    Я попробовал вместо GMEM_MOVEABLE ставить GMEM_FIXED, хотя это неверно, и при 1-м вызове
    ошибок нет, а при 2-м опять те же ошибки. Какая-то загадочная ситуация на ровном месте...
    Просьба не писать на емейл, он уже не работает из-за 3-месячного бездействия.

    Код (Text):
    1. {$apptype console}
    2. uses Windows, SysUtils;
    3.  
    4. procedure CopyStringToClipboard(s: string);
    5. var
    6.   hg: THandle;
    7.   P: PChar;
    8. begin
    9.   hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
    10.   P:=GlobalLock(hg);
    11.   StrPCopy(P, s);
    12.   if not GlobalUnlock(hg) then Writeln('globalunlock error');
    13.   OpenClipboard(0);
    14.   EmptyClipboard;
    15.   SetClipboardData(CF_TEXT, hg);
    16.   CloseClipboard;
    17.   GlobalFree(hg);
    18. end;
    19.  
    20. BEGIN
    21. CopyStringToClipboard('aaa');
    22. CopyStringToClipboard('bbb');
    23. END.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    почитай
    Ч. Петзолд
    Программирование
    для Windows® 95
    в двух томах

    там есть глава про буфер обмена
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    это рабочий код (kwrd - буфер для строки для копирования)
    Код (Text):
    1.     invoke GlobalAlloc,GMEM_MOVEABLE,260
    2.     mov hMem,eax
    Код (Text):
    1. copy2clip proc
    2.     mov al,kwrd
    3.     test al,al
    4.     jz @F
    5.     invoke GlobalLock,hMem
    6.     test eax,eax
    7.     jz @F
    8.     invoke lstrcpy,eax,ADDR kwrd
    9.     invoke GlobalUnlock,hMem
    10.     invoke OpenClipboard,0
    11.     test eax,eax
    12.     jz @F
    13.     invoke EmptyClipboard
    14.     invoke SetClipboardData,CF_TEXT,hMem
    15.     invoke CloseClipboard
    16. @@: ret
    17. copy2clip endp
    пробуй...
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    clubnr
    Ответ простой - освобождать память, выделенную GlobalAlloc и переданную в SetClipboardData нельзя - винда это делает сама. Убери GlobalFree и все должно быть нормально

    PS: Насчет флагов: 1) DDESHARE давно не работает и оставлен только для совместимости, 2) использование FIXED хоть и не документировано, но работает нормально
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В юникод неплохо было бы конвертировать, иначе глюки будут при английской раскладке.
     
  6. clubnr

    clubnr New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2006
    Сообщения:
    11
    Адрес:
    Russia
    Ага спасибо, (также Ieo).
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    clubnr
    Кстати насчет юникода IceStudent верно заметил - могут быть проблемы со вставкой текста в "продвинутые продухты" MS - блокнот, Word, Excel (см. дебаты с картинками)
    Для надежности нужно или самому строку в юникод конвертить, либо кроме CF_TEXT задавать еще CF_LOCALE

    PS: чего-то в новом движке форума старый стиль ссылок на конкретное сообщение на странице типа p=9#10 - не работають :dntknw:(
    PPS: работают, но по другому :))