Top.Mail.Ru
Ответы

Буфер обмена на Ассемблере, проверка данных

Ребята привет, тут немного понять не могу теории, задача простая вроде, хочу сделать определение изменения буфера обмена, только не пойму как правильно это делается, к примеру есть в буфере (1232030423421023112) если буфер изменился выводится сообщение, но с чем его сравнивать то-есть где хранить предыдущий буфер для сравнения с новым? запутал может

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
 format PE GUI 4.0 
entry start 
 
include 'win32w.inc' 
 
;--------------------------------------------- 
 
section '.data' code readable writeable 
 
struct STGMEDIUM 
        tymed           dd ? 
        hGlobal         dd ? 
        pUnkForRelease  dd ? 
ends 
 
struct FORMATETC 
        cfFormat        dd ? 
        lptd            dd ? 
        dwAspect        dd ? 
        lindex          dd ? 
        tymed           dd ? 
ends 
 
; IID_IDataObject Interface 
struct IDataObject 
    ; IUnknown 
    QueryInterface        dd ?   ; 000h 
    AddRef                dd ?   ; 004h 
    Release               dd ?   ; 008h 
    ; IDataObject 
    GetData               dd ?   ; 00Ch 
    GetDataHere           dd ?   ; 010h 
    QueryGetData          dd ?   ; 014h 
    GetCanonicalFormatEtc dd ?   ; 018h 
    SetData               dd ?   ; 01Ch 
    EnumFormatEtc         dd ?   ; 020h 
    DAdvise               dd ?   ; 024h 
    DUnadvise             dd ?   ; 028h 
    EnumDAdvise           dd ?   ; 02Ch 
ends 
 
DVASPECT_CONTENT = 1 
TYMED_HGLOBAL    = 1 
 
fmte   FORMATETC 
medium STGMEDIUM 
 
szTitle du 'Clipboard data',0 
 
pDataObject dd ? 
hGlobal dd ? 
 
;--------------------------------------------- 
 
section '.code' code readable executable 
 
  start: 
        invoke  IsClipboardFormatAvailable,CF_UNICODETEXT 
        or      eax,eax 
        jz      loc_exit 
 
        ; Инициализация 
        invoke  OleInitialize,NULL 
 
        ; Прочитать содержимое буфера обмена 
        invoke  OleGetClipboard,pDataObject 
 
        ; Настроить формат данных 
        mov     [fmte.cfFormat],CF_UNICODETEXT 
        mov     [fmte.lptd],NULL 
        mov     [fmte.dwAspect],DVASPECT_CONTENT 
        mov     [fmte.lindex],-1 
        mov     [fmte.tymed],TYMED_HGLOBAL 
 
        ; Прочитать данные из объекта 
        mov     eax,[pDataObject] 
        mov     eax,[eax] 
        stdcall dword [eax+IDataObject.GetData],[pDataObject],fmte,medium 
 
        ; Получить адрес содержимого 
        invoke  GlobalLock,[medium.hGlobal] 
 
        invoke  MessageBox,HWND_DESKTOP,eax,szTitle,MB_OK 
 
        ; Освободить память 
        invoke  GlobalUnlock,[medium.hGlobal] 
        invoke  ReleaseStgMedium,medium 
 
        ; Вызвать метод интерфейса IDataObject->Release() 
        mov     eax,[pDataObject] 
        mov     eax,[eax] 
        stdcall dword [eax+IDataObject.Release],[pDataObject] 
 
        ; Освободить ресурсы 
        invoke  OleUninitialize 
loc_exit: 
        invoke  ExitProcess,0 
 
;--------------------------------------------- 
 
section '.idata' import data readable writeable 
 
  library kernel32,'kernel32.dll',\ 
          user32,'user32.dll',\ 
          ole32,'ole32.dll' 
 
  include 'apiw\kernel32.inc' 
  include 'apiw\user32.inc' 
 
import ole32,\ 
        OleInitialize,'OleInitialize',\ 
        OleUninitialize,'OleUninitialize',\ 
        OleGetClipboard,'OleGetClipboard',\ 
        ReleaseStgMedium,'ReleaseStgMedium' 
По дате
По рейтингу
Аватар пользователя
Новичок

Прежнее значение буфера можно (и нужно) хранить в сегменте данных. Отвести там массив достаточной длины.
Если нет возможности даже отдалённо понять, как ограничить размер сверху, тогда придётся связываться с динамическим выделением памяти, а это - жесть.