脑袋里没有点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是局部的随时会被释放的。如有不正确还望指正。