Ho disattivato ingresso di linea con il seguente codice:Perché chiamare ReadConsole in un ciclo che danneggia lo stack?
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
Poi sto chiamando ReadConsole in un ciclo ... in un ciclo:
wchar_t cBuf;
while (1) {
/* Display Options */
do {
ReadConsole(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
Se faccio funzionare il programma e premere 0 subito, esiste pulito.
Ma se si preme un mazzo di chiavi, quindi premere 0, quando esiste il programma si blocca con:
Run-Time Check Failure # 2 - pila intorno la variabile 'cBuf' stato danneggiato.
Per quale motivo lo stack risulta danneggiato? Il codice è semplice, quindi non riesco a capire cosa c'è che non va.
piccolo programma che posso riprodurre il problema con:
#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;
}
Devi tipo di schiacciare la tastiera dopo lo si esegue, quindi premere 0, e si blocca con la corruzione dello stack.
Anche io non riesco a riprodurre il problema ogni volta, ci vogliono alcuni tentativi.
L'ho eseguito in Visual Studio 2010, dopo aver creato un nuovo progetto di console vuoto e aggiunto un file con quel codice.
Non riesco a riprodurre il problema. Potresti per favore pubblicare un piccolo ma completo programma che mostri il problema? –
Suggerirei di controllare il valore restituito di 'ReadConsoleW' ed esaminare' GetLastError' quando necessario. Altrimenti, non ne ho idea! –
Controllato il valore di ritorno di 'ReadConsoleW', ma ogni volta il valore di ritorno era diverso da zero, quindi nessun errore. Anche quando si blocca con la corruzione dello stack, il debugger si trova alla fine del programma. – Josh