脑袋里没有点API的储量,想写什么东西还是很困难的。厚积薄发才是硬道理。所以先看看别人的代码,偷学几个API的用法。
SetClipData proc lpData:LPSTR,dwSize:dword
LOCAL hMem:HANDLE ;==>内存块句柄
LOCAL pMem:dword ;==>内存块指针
mov eax,dwSize
shr eax,3
inc eax
shl eax,3 ;==>(dwSize/8 + 1)*8 不满8的倍数则补全
invoke xGlobalAlloc, GHND or GMEM_DDESHARE, eax
test eax,eax ;==>申请成功则继续否则跳转到@exit2
je @exit2
mov hMem,eax
invoke GlobalLock,eax ;hGlob ;==>锁定申请的内存块返回内存块指针
test eax,eax
je @exit1
mov pMem,eax
invoke RtlMoveMemory,eax,lpData,dwSize ;==>复制lpData的内容到申请的内存块中
mov eax,pMem
add eax,dwSize
mov byte ptr [eax],0 ;==>在内存块最后添0结束
invoke GlobalUnlock,hMem ;==>解锁,使内存块指针无效
invoke OpenClipboard,NULL
.if eax
invoke EmptyClipboard
invoke SetClipboardData,CF_TEXT,hMem ;==>将数据关联到剪贴板
invoke CloseClipboard
xor eax,eax ;0 - Ok
jmp @exit3
.endif
@exit1:
invoke GlobalFree, hMem ;==>未锁定成功则释放该内存块
xor eax, eax
@exit2:
dec eax ; -1 - error
@exit3:
ret
SetClipData endp
看完这段代码我有一个疑问,这里是将lpData的数据拷贝到一个内存块,然后与剪贴板关联,我这里解释为关联,我就认为剪贴板不应该是一个内存区域,我猜测是一个链表之类的结构,然后链表每一个节点存储一个内存区域的指针还有其他的信息,然后根据信息来管理。
否则应该可以直接将lpData来跟剪贴板关联。另一个原因是lpData是局部的随时会被释放的。如有不正确还望指正。