1

コードを実行すると、次のエラーが表示されます。

GameLauncher.exe の 0x00BA16A0 で未処理の例外: スタック 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;
}
4

1 に答える 1

1

wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);

シングル用のスペースを割り当てましたwchar_tが、最大 20 文字を読み取って、メモリのアドレス に配置しようとしていますuserProcessToFind。に属していないメモリに書き込もうとすると、スタックが破損します&userProcessToFind。あなたがする必要があるのは、次のような配列を作成することです

wchar_t userProcessToFind[20];
std::wcin.getline(userProcessToFind, 20);

または、 a を使用するstd::wstringと、コードは次のようになります

std::wstring userProcessToFind;
std::getline(std::wcin, userProcessToFind);

std::wstringこれにより、入力に合わせてスケーリングされるため、プロセス名に任意のサイズを使用する必要がないという利点があります。wchar_t*基礎となるものを関数に渡す必要がある場合は、std::wstring::c_str()それを取得するために使用できます。

于 2015-10-03T11:41:00.150 に答える