剪贴板内存的本地副本?

时间:2018-07-12 09:46:11

标签: c winapi clipboard

在下面的示例中,我成功重写了数据。这是否意味着数据存储在本地内存而不是全局内存中?那么GetClipboardData()会在剪贴板上创建一个本地的内存副本吗?如果真是这样,那么在读取该内存之前需要使用GlobalLock()有什么意义?另外,为什么我不必free()本地内存?

这是节录的摘录:Getting Text from the Clipboard

“从GetClipboardData接收到的句柄不属于您的程序,它属于剪贴板。...您无法释放该句柄或更改其引用的数据。如果您需要继续访问数据,您应该[手动使用malloc()]复制内存块。“

#include <stdio.h>
#include <windows.h>

int main(void)
{
    if (IsClipboardFormatAvailable(CF_TEXT) != 0)
    {
        if (OpenClipboard(NULL) != 0)
        {
            HANDLE hData = GetClipboardData(CF_TEXT);
            if (hData != NULL)
            {
                char *content = GlobalLock(hData);
                if(content == NULL)
                    puts("GlobalLock()");
                else
                {
                    size_t length = strlen(content);

                    printf("Before: %s\n", content);
                    FillMemory(content + (length / 2), (length / 2), '*');//Hello World!
                    printf("After : %s\n", content);

                    if (GlobalUnlock(hData) == 0)
                    {
                        if (GetLastError() != NO_ERROR)
                            puts("GlobalUnlock()");
                    }
                }
            }
            else
            {
                if (GetLastError() != ERROR_SUCCESS)
                    puts("GetClipboardData()");
            }

            if (CloseClipboard() == 0)
                puts("CloseClipboard()");
        }
        else
            puts("OpenClipboard()");
    }

    getchar();

    return 0;
}
  

首次执行:
  之前:世界您好!
  之后:您好******

     

第二次执行:
  之前:世界您好!
  之后:您好******

1 个答案:

答案 0 :(得分:1)

  1. 您可以访问共享内存。
  2. 剪贴板内存分配为GMEM_MOVEABLE!因此,要接收实际的指针,您需要GlobalLock
  3. 剪贴板内存(甚至您过程中的 copy )都归剪贴板所有,并由剪贴板处理程序释放。绝对不允许您释放内存。调用CloseClipboard
  4. 时可能会释放内存

有关剪贴板的更多内部信息,请阅读this