如何将字符数组复制到剪贴板?

时间:2012-05-10 13:40:52

标签: c++ winapi clipboard

我正在尝试将我的应用程序复制到剪贴板,以便将其粘贴到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。

3 个答案:

答案 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();
    }
}