2010-05-13 5 views
4

Je suis en train d'obtenir une simple morceau de code que je trouve sur un site Web pour travailler dans VC++ 2010 sur windows vista 64:Stack autour de la variable 'xyz' a été corrompu

#include "stdafx.h" 
#include <windows.h> 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
DWORD dResult; 
BOOL result; 
char oldWallPaper[MAX_PATH]; 

result = SystemParametersInfo(SPI_GETDESKWALLPAPER, sizeof(oldWallPaper)-1, oldWallPaper, 0); 

fprintf(stderr, "Current desktop background is %s\n", oldWallPaper); 

return 0; 
} 

il ne compile, mais quand je le lance, je reçois toujours cette erreur:

Run-Time Check Failure #2 - Stack around the variable 'oldWallPaper' was corrupted. 

Je ne sais pas ce qui va mal, mais j'ai remarqué, que la valeur de oldWallPaper ressemble à quelque chose comme « C \ 0: \ 0 \ 0U \ 0s \ 0e \ 0r \ 0s [...] "- Je me demande d'où viennent tous les \ 0.

  • Un de mes amis a compilé sur Windows XP 32 (également VC++ 2010) et est capable de fonctionner sans problèmes

des indices/astuces/opinions?

merci

+0

Vous ne devriez pas utiliser 'sizeof' sur un tableau, il ne fonctionnera pas sur un tableau que vous avez' malloc' 'd. – bobobobo

Répondre

4

Le document n'est pas très clair. La chaîne renvoyée est un WCHAR, deux octets par caractère et non un. Vous devez donc allouer deux fois plus d'espace sinon vous obtenez un dépassement de mémoire tampon. Essayez:

BOOL result; 
WCHAR oldWallPaper[(MAX_PATH + 1)]; 

result = SystemParametersInfo(SPI_GETDESKWALLPAPER, 
_tcslen(oldWallPaper), oldWallPaper, 0); 

Voir aussi:

http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx

http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx (conversion de chaîne)

+0

Ceci est la bonne réponse. Aussi, c'est C++, pas C. std :: wcerr << L "L'arrière-plan actuel du bureau est" << oldWallPaper; – Puppy

+0

merci beaucoup, les gars! – tirolerhut

+2

Je suppose & oldWallPaper devrait être oldWallPaper –

3

Chaque fonction Windows dispose de 2 versions:

SystemParametersInfoA() // Ascii 
SystemParametersInfoW() // Unicode 

La version se termine par W est- le wide character type (c'est-à-dire Unicode) version de la fonction. Tous les \ 0 que vous voyez sont parce que chaque caractère que vous récupérez est en Unicode - 16 octets par caractère - le deuxième octet arrive à 0. Donc vous devez stocker le résultat dans un tableau wchar_t, et utiliser wprintf au lieu de printf

wchar_t oldWallPaper[MAX_PATH]; 
result = SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH-1, oldWallPaper, 0); 
wprintf(L"Current desktop background is %s\n", oldWallPaper); 

vous pouvez utiliser la version ASystemParametersInfoA() si vous êtes un puriste ne pas utiliser Unicode. Pour l'enregistrement, vous devriez toujours essayer d'utiliser Unicode, cependant.

Habituellement SystemParametersInfo() est une macro qui évalue à la version W, si UNICODE est défini sur votre système.

Questions connexes