2010-05-13 2 views
4

Я пытаюсь получить простой кусок кода, который я нашел на сайте, чтобы работать в 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 [...] "- Мне интересно, откуда все из \ 0s.

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

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

спасибо

+0

Вы не должны использовать 'sizeof' в массиве, он будет _not_ работать с массивом, который у вас есть' malloc' 'd. – bobobobo

ответ

4

Документ не очень ясен. Возвращенная строка - 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 (строка преобразования)

функция
+0

Это правильный ответ. Кроме того, это C++, а не C. std :: wcerr << L "Текущий фон рабочего стола" << oldWallPaper; – Puppy

+0

большое спасибо, ребята! – tirolerhut

+2

Я предполагаю, что & oldWallPaper должен быть старымWallPaper –

3

Каждый Windows, имеет 2 версии:

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

версия заканчивается в W является wide character type (т.е. Unicode). Все \ 0, которые вы видите, это потому, что каждый символ, который вы возвращаете, находится в Юникоде - 16 байт на символ - второй байт бывает 0. Поэтому вам нужно сохранить результат в массиве wchar_t и использовать wprintf вместо 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 определен в вашей системе.