Буфер обмена на Ассемблере, проверка данных
Ребята привет, тут немного понять не могу теории, задача простая вроде, хочу сделать определение изменения буфера обмена, только не пойму как правильно это делается, к примеру есть в буфере (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'
По дате
По рейтингу
Прежнее значение буфера можно (и нужно) хранить в сегменте данных. Отвести там массив достаточной длины.
Если нет возможности даже отдалённо понять, как ограничить размер сверху, тогда придётся связываться с динамическим выделением памяти, а это - жесть.