腦袋里沒有點(diǎn)API的儲(chǔ)量,想寫什么東西還是很困難的。厚積薄發(fā)才是硬道理。所以先看看別人的代碼,偷學(xué)幾個(gè)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ù)則補(bǔ)全
invoke xGlobalAlloc, GHND or GMEM_DDESHARE, eax
test eax,eax ;==>申請(qǐng)成功則繼續(xù)否則跳轉(zhuǎn)到@exit2
je @exit2
mov hMem,eax
invoke GlobalLock,eax ;hGlob ;==>鎖定申請(qǐng)的內(nèi)存塊返回內(nèi)存塊指針
test eax,eax
je @exit1
mov pMem,eax
invoke RtlMoveMemory,eax,lpData,dwSize ;==>復(fù)制lpData的內(nèi)容到申請(qǐng)的內(nèi)存塊中
mov eax,pMem
add eax,dwSize
mov byte ptr [eax],0 ;==>在內(nèi)存塊最后添0結(jié)束
invoke GlobalUnlock,hMem ;==>解鎖,使內(nèi)存塊指針無(wú)效
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
看完這段代碼我有一個(gè)疑問,這里是將lpData的數(shù)據(jù)拷貝到一個(gè)內(nèi)存塊,然后與剪貼板關(guān)聯(lián),我這里解釋為關(guān)聯(lián),我就認(rèn)為剪貼板不應(yīng)該是一個(gè)內(nèi)存區(qū)域,我猜測(cè)是一個(gè)鏈表之類的結(jié)構(gòu),然后鏈表每一個(gè)節(jié)點(diǎn)存儲(chǔ)一個(gè)內(nèi)存區(qū)域的指針還有其他的信息,然后根據(jù)信息來管理。
否則應(yīng)該可以直接將lpData來跟剪貼板關(guān)聯(lián)。另一個(gè)原因是lpData是局部的隨時(shí)會(huì)被釋放的。如有不正確還望指正。