При запуске моего кода я получаю следующую ошибку:
Необработанное исключение в 0x00BA16A0 в GameLauncher.exe: код инструментария cookie стека обнаружил переполнение буфера в стеке.
Я понятия не имею, что может быть причиной этого. Это вызвано следующим кодом:
#include "stdafx.h"#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
int main()
{
std::cout << "Which process would you like to close? (Include .exe)" << std::endl;
wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);
HANDLE processSnapshot;
DWORD processID = 0;
PROCESSENTRY32 processEntery;
processEntery.dwSize = sizeof(PROCESSENTRY32);
processSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processID);
if(Process32First(processSnapshot, &processEntery) == TRUE)
{
while (Process32Next(processSnapshot, &processEntery) == TRUE)
{
if (_wcsicmp(processEntery.szExeFile, &userProcessToFind) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntery.th32ProcessID);
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
CloseHandle(processSnapshot);
}
return 0;
}
В
wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);
Вы выделили место для одного wchar_t
но вы пытаетесь прочитать до 20 символов и поместить его в память по адресу userProcessToFind
, Это приведет к повреждению стека при попытке записи в память, которая не принадлежит &userProcessToFind
, Что вам нужно сделать, это создать массив, как
wchar_t userProcessToFind[20];
std::wcin.getline(userProcessToFind, 20);
Или вы могли бы использовать std::wstring
и ваш код станет
std::wstring userProcessToFind;
std::getline(std::wcin, userProcessToFind);
Это дает преимущество в том, что не нужно использовать произвольный размер для имени процесса, так как std::wstring
будет масштабироваться в соответствии с входом. Если вам нужно передать базовый wchar_t*
к функции, которую вы можете использовать std::wstring::c_str()
чтобы получить это.
Других решений пока нет …