我正在尝试将我的应用程序复制到剪贴板,以便将其粘贴到IE地址栏中。我遇到了解决这个问题的问题。这是我正在使用的代码:
HGLOBAL glob = GlobalAlloc(GMEM_FIXED,32);
memcpy(glob,array,sizeof(array));
OpenClipboard(hDlg);
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT,glob);
CloseClipboard();
数组声明为:
char array[500];
这会导致程序崩溃。但是,如果我用一个数字切换sizeof(array)
就可以,但只有8个字符被复制到剪贴板。
有人可以告诉我如何解决这个问题吗?我直接针对Win32 API,而不是使用MFC。
答案 0 :(得分:5)
您只分配32个字节的全局内存:
GlobalAlloc(GMEM_FIXED,32);
...然后尝试将500个字节填入32字节包:
memcpy(glob,array,sizeof(array));
将GlobalAlloc更改为:
GlobalAlloc(GMEM_FIXED,sizeof(array));
此外,您将数据粘贴为Unicode文本(CF_UNICODETEXT
),但它不是Unicode文本。我想这会导致......问题。
将其粘贴为纯文本:
SetClipboardData(CF_TEXT,glob);
答案 1 :(得分:2)
您正在将500个字符(sizeof(array)
)复制到一个只有32个字符空间的缓冲区中。所有剩余的字符都会随机数据进行跟踪并导致崩溃。
答案 2 :(得分:1)
我创建了一个保存和加载剪贴板的功能。
#include <Windows.h>
char* LoadClipboard()
{
static HANDLE clip;
if(OpenClipboard(NULL))
{
clip = GetClipboardData(CF_TEXT);
CloseClipboard();
}
return (char*) clip;
}
void SaveClipboard(char* text)
{
HGLOBAL global = GlobalAlloc(GMEM_FIXED,strlen(text) + 1); //text size + \0 character
memcpy(global,text,strlen(text)); //text size + \0 character
if(OpenClipboard(NULL))
{
EmptyClipboard();
SetClipboardData(CF_TEXT,global);
CloseClipboard();
}
}