0

我试图让我的应用程序将字符数组复制到剪贴板,以便可以将其粘贴到 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。

4

3 回答 3

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);
于 2012-05-10T13:50:02.327 回答
2

您正在将 500 个字符 ( sizeof(array)) 复制到只有 32 个字符空间的缓冲区中。所有剩余的字符都会践踏随机数据并导致崩溃。

于 2012-05-10T13:52:29.767 回答
2

我创建了一个函数来保存和加载剪贴板。

#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();
    }
}
于 2014-09-29T19:31:57.693 回答