Просьба подсказать, где ошибка в этом примере на запись строки в clipboard. Все сделано, как в справке. При первом обращении к CopyStringToClipboard GlobalUnlock выдает ошибку (остальные win api не выдают), при расшифровке которой через getlasterror получаем строку, что "операция успешно завершена". В буфер записывается aaa. При втором обращении к процедуре кроме этого SetClipboardData и GlobalFree выдают ошибку "неверный дескриптор". Буфер пуст. Реальная программка в GUI и там в вызове OpenClipboard(0) вместо 0 ставится хендл окна програмы, но ошибки те же самые. Я попробовал вместо GMEM_MOVEABLE ставить GMEM_FIXED, хотя это неверно, и при 1-м вызове ошибок нет, а при 2-м опять те же ошибки. Какая-то загадочная ситуация на ровном месте... Просьба не писать на емейл, он уже не работает из-за 3-месячного бездействия. Код (Text): {$apptype console} uses Windows, SysUtils; procedure CopyStringToClipboard(s: string); var hg: THandle; P: PChar; begin hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1); P:=GlobalLock(hg); StrPCopy(P, s); if not GlobalUnlock(hg) then Writeln('globalunlock error'); OpenClipboard(0); EmptyClipboard; SetClipboardData(CF_TEXT, hg); CloseClipboard; GlobalFree(hg); end; BEGIN CopyStringToClipboard('aaa'); CopyStringToClipboard('bbb'); END.
это рабочий код (kwrd - буфер для строки для копирования) Код (Text): invoke GlobalAlloc,GMEM_MOVEABLE,260 mov hMem,eax Код (Text): copy2clip proc mov al,kwrd test al,al jz @F invoke GlobalLock,hMem test eax,eax jz @F invoke lstrcpy,eax,ADDR kwrd invoke GlobalUnlock,hMem invoke OpenClipboard,0 test eax,eax jz @F invoke EmptyClipboard invoke SetClipboardData,CF_TEXT,hMem invoke CloseClipboard @@: ret copy2clip endp пробуй...
clubnr Ответ простой - освобождать память, выделенную GlobalAlloc и переданную в SetClipboardData нельзя - винда это делает сама. Убери GlobalFree и все должно быть нормально PS: Насчет флагов: 1) DDESHARE давно не работает и оставлен только для совместимости, 2) использование FIXED хоть и не документировано, но работает нормально
clubnr Кстати насчет юникода IceStudent верно заметил - могут быть проблемы со вставкой текста в "продвинутые продухты" MS - блокнот, Word, Excel (см. дебаты с картинками) Для надежности нужно или самому строку в юникод конвертить, либо кроме CF_TEXT задавать еще CF_LOCALE PS: чего-то в новом движке форума старый стиль ссылок на конкретное сообщение на странице типа p=9#10 - не работають ( PPS: работают, но по другому )