MFC剪切板操作的若干函数

本文详细介绍了MFC中与剪切板操作相关的几个关键函数,包括GlobalAlloc用于分配内存,GlobalLock和GlobalUnlock进行内存锁定与解锁,以及GlobalFree释放内存的功能和使用注意事项。这些函数在MFC应用程序中处理剪切板数据时起到重要作用。
摘要由CSDN通过智能技术生成

//MFC剪切板操作的标准模式源码:

void CMFCClipboardDlg::OnBnClickedCopyButton() 
{ 
    / 
    // 1. Get text from edit control. 
    //  
 
    CString strData; 
    m_editSource.GetWindowTextW(strData); 
 
    int len = strData.GetLength(); 
 
    if (len <= 0) 
        return; 
    / 
    // 2. Open and empty clipboard. (OpenClipboard, EmptyClipboard) 
    //  
 
    if (!OpenClipboard()) 
        return; 
 
    EmptyClipboard();   
    / 
    // 3. Create global buffer. (GlobalAlloc) 
    //  
 
    HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1)); 
     
    if (hglbCopy == NULL)  
    {  
        CloseClipboard();  
        return;  
    } 
    / 
    // 4. Lock the buffer. (GlobalLock) 
    //  
 
    char* lptstrCopy = (char*)GlobalLock(hglbCopy);  
    / 
    // 5. Copy text to the buffer. (strcpy) 
    //  
 
    strcpy(lptstrCopy, (CStringA)strData);  
    / 
    // 6. Unlock the buffer. (GlobalUnlock) 
    //  
 
    GlobalUnlock(hglbCopy);  
 
    / 
    // 7. Set buffer data to clipboard. (SetClipboardData) 
    //  
    SetClipboardData(CF_TEXT, hglbCopy);  
    / 
    // 8. Close clipboard. (CloseClipboard) 
    //  
    CloseClipboard();      
}

其中的几个函数的解释如下:

调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 
调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,然后返回一个指向被锁定的内存块的指针。您可以用该指针来读写内存。 
调用GlobalUnlock函数来解锁先前被锁定的内存,该函数使得指向内存块的指针无效。 
调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。

GlobalAlloc 

函数原型
GlobalAlloc(UINT uFLAG,DWORD dwBytes);
说明 
分配一个全局内存块 
返回值 
Long,返回全局内存句柄。零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
uFlags Long,对分配的内存类型进行定义的常数标志,如下所示: 
             GMEM_FIXED 分配一个固定内存块 
             GMEM_MOVEABLE 分配一个可移动内存块 
             GMEM_DISCARDABLE 分配一个可丢弃内存块 
             GMEM_NOCOMPACT 堆在这个函数调用期间不进行累积 
             GMEM_NODISCARD 函数调用期间不丢弃任何内存块 
             GMEM_ZEROINIT 新分配的内存块全部初始化成零 
dwBytes Long,要分配的字符数 
注解  
如指定了 GMEM_FIXED,那么返回值就是要使用的实际内存地址即指针(GlobalLock 会返回同样的值)——所以在使用固定内存块的时候不需要执行一个 GlobalLock/GlobalUnlock 操作
由于 Win32 采用了高级的内存管理方案,所以使用可移动的内存块并没有什么好处
用这个函数分配的内存块允许在8位边界以内

GlobalLock  
函数功能描述:锁定一个全局的内存对象,返回指向该对象的第一个字节的指针
函数原型
LPVOID GlobalLock( HGLOBAL hMem )
参数
hMem:全局内存对象的句柄。这个句柄是通过GlobalAlloc或GlobalReAlloc来得到的
返回值:
调用成功,返回指向该对象的第一个字节的指针
调用失败,返回NULL,可以用GetLastError来获得出错信息
注意:
调用过GlobalLock锁定一块内存区后,一定要调用GlobalUnlock来解锁。

GlobalUnlock
函数功能描述:
解除被锁定的全局内存对象
函数原型:BOOL GlobalUnlock( HGLOBAL hMem );
参数:hMem:全局内存对象的句柄
返回值:
非零值,指定的内存对象仍处于被锁定状态
0,函数执行出错,可以用GetLastError来获得出错信息,如果返回NO_ERROR,则表示内存对象已经解锁了
注意:这个函数实际上是将内存对象的锁定计数器减一,如果计数器不为0,则表示执行过多个GlobalLock函数来对这个内存对象加锁,需要对应数目的GlobalUnlock函数来解锁。

如果通过GetLastError函数返回错误码为ERROR_NOT_LOCKED,则表示未加锁或已经解锁。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值