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 文字だけです。

この問題を解決する方法を教えてもらえますか? MFC を使用せずに、Win32 API を直接ターゲットにしています。

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 に答える