Стек вокруг переменной 'xyz' поврежден - PullRequest
4 голосов
/ 13 мая 2010

Я пытаюсь заставить какой-то простой фрагмент кода, найденный на веб-сайте, работать в VC ++ 2010 на Windows Vista 64:

#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;
}

он компилируется, но когда я его запускаю, я всегда получаю эту ошибку:

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

Я не уверен, что происходит не так, но я заметил, что значение oldWallPaper выглядит примерно как "C \ 0: \ 0 \ 0U \ 0s \ 0e \ 0r \ 0s [...]" Мне интересно, откуда берутся все \ 0.

  • Мой друг скомпилировал его на Windows XP 32 (также VC ++ 2010) и может запустить его без проблем

какие-либо подсказки / подсказки / мнения?

спасибо

Ответы [ 2 ]

4 голосов
/ 13 мая 2010

Документ не очень понятен. Возвращаемая строка - это WCHAR, два байта на символ, а не один, поэтому вам нужно выделить вдвое больше места, иначе вы получите переполнение буфера. Попробуйте:

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

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

Смотри также:

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

http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx (преобразование строки)

3 голосов
/ 03 декабря 2010

Каждая функция Windows имеет 2 версии:

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

Версия, оканчивающаяся на W, является wide character type (то есть Unicode) версией функции. Все \ 0, которые вы видите, это то, что каждый возвращаемый символ находится в Юникоде - 16 байт на символ - второй байт равен 0. Поэтому вам нужно сохранить результат в массиве wchar_t и использовать 1007 * вместо printf

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

Так что вы можете использовать A версию SystemParametersInfoA(), если вы одержимы тем, что не используете Unicode. Однако, для записи, вы всегда должны использовать Unicode.

Обычно SystemParametersInfo() - это макрос, который оценивается как версия W, если в вашей системе определен UNICODE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...