在下面的示例中,我成功重写了数据。这是否意味着数据存储在本地内存而不是全局内存中?那么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;
}
首次执行:
之前:世界您好!
之后:您好******第二次执行:
之前:世界您好!
之后:您好******
答案 0 :(得分:1)
GMEM_MOVEABLE
!因此,要接收实际的指针,您需要GlobalLock
CloseClipboard
有关剪贴板的更多内部信息,请阅读this。