腦袋里沒有點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是局部的隨時會被釋放的。如有不正確還望指正。