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