腦袋里沒有點API的儲量,想寫什么東西還是很困難的。厚積薄發(fā)才是硬道理。所以先看看別人的代碼,偷學(xué)幾個API的用法。
SetClipData proc lpData:LPSTR,dwSize:dword
LOCAL hMem:HANDLE ;==>內(nèi)存塊句柄
LOCAL pMem:dword ;==>內(nèi)存塊指針

mov eax,dwSize
shr eax,3
inc eax
shl eax,3 ;==>(dwSize/8 + 1)*8 不滿8的倍數(shù)則補全
invoke xGlobalAlloc, GHND or GMEM_DDESHARE, eax
test eax,eax ;==>申請成功則繼續(xù)否則跳轉(zhuǎn)到@exit2
je @exit2
mov hMem,eax
invoke GlobalLock,eax ;hGlob ;==>鎖定申請的內(nèi)存塊返回內(nèi)存塊指針
test eax,eax
je @exit1
mov pMem,eax
invoke RtlMoveMemory,eax,lpData,dwSize ;==>復(fù)制lpData的內(nèi)容到申請的內(nèi)存塊中
mov eax,pMem
add eax,dwSize
mov byte ptr [eax],0 ;==>在內(nèi)存塊最后添0結(jié)束
invoke GlobalUnlock,hMem ;==>解鎖,使內(nèi)存塊指針無效
invoke OpenClipboard,NULL
.if eax
invoke EmptyClipboard
invoke SetClipboardData,CF_TEXT,hMem ;==>將數(shù)據(jù)關(guān)聯(lián)到剪貼板
invoke CloseClipboard
xor eax,eax ;0 - Ok
jmp @exit3
.endif
@exit1:
invoke GlobalFree, hMem ;==>未鎖定成功則釋放該內(nèi)存塊
xor eax, eax
@exit2:
dec eax ; -1 - error
@exit3:
ret

SetClipData endp
看完這段代碼我有一個疑問,這里是將lpData的數(shù)據(jù)拷貝到一個內(nèi)存塊,然后與剪貼板關(guān)聯(lián),我這里解釋為關(guān)聯(lián),我就認為剪貼板不應(yīng)該是一個內(nèi)存區(qū)域,我猜測是一個鏈表之類的結(jié)構(gòu),然后鏈表每一個節(jié)點存儲一個內(nèi)存區(qū)域的指針還有其他的信息,然后根據(jù)信息來管理。
否則應(yīng)該可以直接將lpData來跟剪貼板關(guān)聯(lián)。另一個原因是lpData是局部的隨時會被釋放的。如有不正確還望指正。