Я пытаюсь получить версию какой-то программы через реестр. Мой код работает нормально, когда установлен в конфигурации выпуска. Когда я пытаюсь запустить его в режиме отладки, мой код вылетает при выходе из этой функции с сообщением «Ошибка проверки времени выполнения № 2 — стек вокруг переменной« версия »был поврежден».
Я буду вставлять только соответствующий код моей функции. Это все «версии» появления в моем коде. Когда я отлаживаю его, версия получает правильное значение. Код не падает в конфигурации выпуска. Для обеих конфигураций я установил «Использовать многобайтовый набор символов».
TCHAR version[20];
DWORD dwBufferSize = 0;
if (RegQueryValueEx(hAppKey, "DisplayVersion", NULL,&dwType, (unsigned char*)version, &dwBufferSize) == ERROR_SUCCESS)
{
dwBufferSize = 20;
std::string vers(version, dwBufferSize);
return vers;
}
Есть идеи как это решить?
Ваш код делает не отлично работает в релизе. Он содержит переполнение буфера, на которое накапливается отладочная сборка, которая содержит дополнительную проверку ошибок.
Беглый взгляд в документации для RegQueryValueEx показывает, что вы делаете неправильно:
LONG WINAPI RegQueryValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ LPDWORD lpReserved,
_Out_opt_ LPDWORD lpType,
_Out_opt_ LPBYTE lpData,
_Inout_opt_ LPDWORD lpcbData
);
lpcbData [in, out, необязательно] Указатель на переменную, которая указывает размер буфера, на который указывает параметр lpData, в байтах. Когда функция возвращается, эта переменная содержит размер данных, скопированных в lpData.
Вы говорите функции, что ваш буфер имеет размер 0, когда он на самом деле равен 20 * sizeof (TCHAR) байтов, а не 0 и не 20.
Пожалуйста, будьте супер осторожны, когда вам приходится иметь дело со строками в стиле c. Похоже, вы вводите уязвимость в свой код.
Похоже, вы говорите, что размер вашего буфера равен нулю. Почему ты не говоришь 20?
Похоже, что это неправильно, так как ваш буфер равен 0. Но это 20 TCHAR:
DWORD dwBufferSize = 0;
Вероятно, должно быть:
DWORD dwBufferSize = sizeof(version);
Это важно, потому что это используется для передачи в RegQueryValueEx
как размер version
буфер. RegQueryValueEx
просто так происходит обновление этого значения, когда оно возвращается с количеством фактически использованных байтов.