REALiSTiC Еще раз повторяю для бестолковых - GetClipboardData возвращает не указатель на текст, а хэндл перемещаемого блока памяти. Чтобы получить указатель на строку нужно вызвать GlobalLock: Код (Text): invoke OpenClipboard,0 invoke GetClipboardData,CF_TEXT test eax,eax jz fail mov hMem,eax invoke GlobalLock,eax ;!!! ------- cmp byte ptr [eax],'C' jne fail invoke lstrlen,eax cmp eax,13 jne fail invoke GlobalUnlock,hMem ;!!! ------- invoke GlobalAlloc, GMEM_MOVEABLE, 100h mov hMem,eax invoke GlobalLock,eax ;!!! ------- ............ invoke GlobalUnlock,hMem ;!!! ------- invoke EmptyClipboard invoke SetClipboardData,CF_TEXT,hMem fail: invoke GlobalUnlock,hMem ;допустим повторный вызов invoke CloseClipboard
Тема закрыта. Решение проблемы: Код (Text): invoke OpenClipboard,NULL invoke GetClipboardData,CF_TEXT .if byte ptr [eax] == 'C' invoke lstrlen,eax .if eax == 13 invoke lstrcpy,hMemory,offset code invoke EmptyClipboard
Человек создаёт тему, получает советы и ответы, и в конце концов делает всё по-своему - т.е. неправильно... ну что тут сказать.
REALiSTiC Это частное решение, т.к. без GlobalLock работать будет только при условии, что строка в буфере была выделена в куче 1) твоего процесса 2) без флага GMEM_MOVEABLE - только в этом сл.GetClipboardData возвратит данные "как усть". Если же строка копируется в буфер в другом процессе или в твоем из Edit через стандартный обработчик WM_COPY, то GetClipboardData будет возвращать хэндл HGLOBAL. Ничего страшного при этом не произойдет - просто условие .if byte ptr [eax] == "C" никогда не выполнится (т.к. HGLOBAL это указатель, выравненный на 8, а код символа "C" - нечетный)