2012-05-10 3 views
0

J'essaie d'obtenir mon application pour copier un tableau de caractères dans le presse-papiers afin qu'il puisse être collé dans une barre d'adresse IE. J'ai un problème avec ça. Ce code, je travaille avec:Comment copier un tableau de caractères dans le presse-papiers?

HGLOBAL glob = GlobalAlloc(GMEM_FIXED,32); 
memcpy(glob,array,sizeof(array)); 
OpenClipboard(hDlg); 
EmptyClipboard(); 
SetClipboardData(CF_UNICODETEXT,glob); 
CloseClipboard(); 

tableau est déclaré:

char array[500]; 

Cela entraînera un plantage du programme. Toutefois, si je change sizeof(array) avec un nombre, mais ok, les 8 seuls caractères sont copiés dans le presse-papiers.

Quelqu'un peut-il me conseiller sur la façon de résoudre ce problème? Je cible directement l'API Win32, n'utilisant pas MFC.

+2

Montrez-nous la déclaration de 'array' –

+0

@JohnDiblin J'ai tableau déclaré comme ceci' tableau de caractères [500]; 'dans la même méthode. – L337BEAN

+1

Ensuite, vous avez un problème là. Ce n'est pas du texte Unicode s'il est stocké dans un tableau de 'char'. –

Répondre

5

Vous n'allouez 32 octets de mémoire globale:

GlobalAlloc(GMEM_FIXED,32); 

... et puis essayer de caser 500 octets dans un sac de 32 octets:

memcpy(glob,array,sizeof(array)); 

Modifier le GlobalAlloc à:

GlobalAlloc(GMEM_FIXED,sizeof(array)); 

De plus, vous collez les données sous forme de texte Unicode (CF_UNICODETEXT), mais ce n'est pas tex Unicode t. J'imagine que cela causerait ... des problèmes.

Coller comme texte brut au lieu:

SetClipboardData(CF_TEXT,glob); 
+0

Vous avez raison. Cela semble tellement évident que je ne sais pas comment je l'ai raté. Vous avez également raison concernant le 'CF_TEXT'. Merci pour votre réponse rapide et informative. – L337BEAN

2

Vous copiez 500 caractères (sizeof(array)) dans un tampon qui a seulement l'espace pour 32 caractères. Tous les caractères restants écrasent des données aléatoires et provoquent le crash.

1

J'ai créé une fonction pour enregistrer et charger le presse-papiers.

#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(); 
    } 
} 
Questions connexes