I deaktiviert Line-Eingang mit dem folgenden Code haben:Warum ruft ReadConsole in einer Schleife den Stack auf?
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
Dann nenne ich Readconsole in einer Schleife ... in einer Schleife:
wchar_t cBuf;
while (1) {
/* Display Options */
do {
ReadConsole(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
Wenn ich das Programm ausführen und drücken 0 sofort, es existiert sauber.
Aber wenn ich ein paar Tasten drücken, und drücken Sie dann 0, wenn das Programm existiert stürzt mit:
Run-Time Check Failure # 2 - Stapeln Sie rund um die Variable 'cbuf' beschädigt wurde.
Warum wird der Stapel dadurch beschädigt? Der Code ist einfach, deshalb kann ich nicht herausfinden, was falsch ist.
kleines Programm, das ich das Problem mit reproduzieren kann:
#include <windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t *argv[])
{
DWORD dwNumRead;
wchar_t cBuf;
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
while (true)
{
wprintf(L"\nEnter option: ");
do {
ReadConsoleW(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
return 0;
}
Sie müssen Art der Tastatur Maische, nachdem Sie es ausführen, dann 0 drücken, und stürzt mit dem Stapel Korruption.
Ich kann das Problem auch nicht jedes Mal reproduzieren, es dauert ein paar Versuche.
Ich habe es unter Visual Studio 2010 ausgeführt, nachdem ich ein neues leeres Konsolenprojekt erstellt und eine Datei mit diesem Code hinzugefügt habe.
Ich kann das Problem nicht reproduzieren. Könnten Sie bitte ein kleines, aber vollständiges Programm veröffentlichen, das das Problem aufzeigt? –
Ich würde vorschlagen, den Rückgabewert von 'ReadConsoleW' zu überprüfen und' GetLastError' zu überprüfen, wenn benötigt. Sonst habe ich keine Ahnung! –
Überprüft den Rückgabewert von 'ReadConsoleW', aber jedes Mal war der Rückgabewert ungleich Null, also keine Fehler. Auch wenn es mit der Stapelbeschädigung abstürzt, ist der Debugger am Ende des Programms. – Josh