剪贴板内存的本地副本?
Local copy of clipboard memory?
在下面的例子中,我成功覆盖了数据。这是否意味着数据存储在本地内存而不是全局内存中?所以 GetClipboardData()
制作剪贴板内存的本地副本?如果是这样,那么在读取该内存之前要求使用 GlobalLock()
有什么意义。另外,为什么我不必 free()
那个本地内存?
这是来自以下部分的摘录:Getting Text from the Clipboard
"The handle you receive from GetClipboardData doesn't belong to your program—it belongs to the clipboard. ... You can't free that handle or alter the data it references. If you need to have continued access to the data, you should [manually using malloc()] make a copy of the memory block."
#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;
}
First execution:
Before: Hello World!
After : Hello ******
Second execution:
Before: Hello World!
After : Hello ******
- 您可以访问共享内存。
- 剪贴板内存分配为
GMEM_MOVEABLE
!所以要接收你需要的实际指针 GlobalLock
- 剪贴板内存(甚至是您进程中的 copy)由剪贴板拥有并由剪贴板处理程序释放。永远不允许您释放内存。内存可能在调用
CloseClipboard
时被释放
有关剪贴板的更多内部信息,请阅读 this。
在下面的例子中,我成功覆盖了数据。这是否意味着数据存储在本地内存而不是全局内存中?所以 GetClipboardData()
制作剪贴板内存的本地副本?如果是这样,那么在读取该内存之前要求使用 GlobalLock()
有什么意义。另外,为什么我不必 free()
那个本地内存?
这是来自以下部分的摘录:Getting Text from the Clipboard
"The handle you receive from GetClipboardData doesn't belong to your program—it belongs to the clipboard. ... You can't free that handle or alter the data it references. If you need to have continued access to the data, you should [manually using malloc()] make a copy of the memory block."
#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;
}
First execution:
Before: Hello World!
After : Hello ******Second execution:
Before: Hello World!
After : Hello ******
- 您可以访问共享内存。
- 剪贴板内存分配为
GMEM_MOVEABLE
!所以要接收你需要的实际指针GlobalLock
- 剪贴板内存(甚至是您进程中的 copy)由剪贴板拥有并由剪贴板处理程序释放。永远不允许您释放内存。内存可能在调用
CloseClipboard
时被释放
有关剪贴板的更多内部信息,请阅读 this。