Диалоговое окно WinAPI Write Edit to Pipe (ошибка: стек вокруг переменной «x» был поврежден)

Кажется, я решил большинство своих проблем, просто запустив многопоточность в своем приложении! Однако я сталкиваюсь с небольшой ошибкой: «Стек вокруг переменной« x »был поврежден». Он работает правильно (после прерывания ошибки отладки), но, очевидно, у меня не может быть ошибки каждый раз, когда кто-то запускает приложение. Итак, вот соответствующий код. Это обратный вызов одного из моих рабочих потоков.

DWORD WINAPI Arc_writePipe(LPVOID threadParam)
{
    Arc_Redirect ar;
    DWORD dwWrote;
    CHAR chBuf[BUFSIZE];
    HANDLE hPipe = (HANDLE)threadParam;
    HWND g1   = FindWindow("GUI",NULL);
    HWND dlg  = GetDlgItem(g1,IDO_WORLDOUT);
    //int nLength = GetWindowTextLength(GetDlgItem(g1,IDO_WORLDINPUT));

    while(bRunThread)
    {
        if(GetDlgItemText(g1,IDO_WORLDINPUT,chBuf,BUFSIZE))
        {
            chBuf[BUFSIZE] = '\0';
            if(!WriteFile(hPipe,chBuf,BUFSIZE,&dwWrote,NULL))
            {
                //SetDlgItemText(g1,IDO_WORLDINPUT,NULL); // This is to reset text when done sending to input
                if(GetLastError() == ERROR_NO_DATA)
                    break; // Normal :)
                else
                    MessageBox(g1,"Error: Could not WriteFile();","Error",MB_ICONERROR);
            }
        }
    }
    return 1;
}

У кого-нибудь есть идеи, почему эта ошибка продолжает происходить? Я не получаю никаких выходных данных GetLastError(), кроме "ERROR_NO_DATA", после записи данных, поэтому я предполагаю, что это как-то связано с моим WriteFile(); функция в сочетании с BUFSIZE (определено в 0x1000). Так что в основном я делаю что-то не так. Кто-нибудь знает, возможно, лучший способ получить информацию из диалогового окна редактирования и записать ее в канал?

Большое спасибо за Вашу помощь!

С уважением,
Деннис М.


person RageD    schedule 13.07.2010    source источник
comment
Я не вижу никакой переменной x в вашем коде. Какая фактическая переменная повреждена?   -  person JSBձոգչ    schedule 13.07.2010


Ответы (2)


Я не знаю, где происходит повреждение, поэтому я не знаю, в чем именно проблема. Однако следующая строка неверна:

chBuf[BUFSIZE] = '\0';

Вы объявили chBuf с размером BUFSIZE, что означает, что индекс BUFSIZE фактически находится за пределами массива. Это приведет к повреждению стека. Что вам действительно нужно сделать, так это chBuf[BUFSIZE - 1] = '\0';

person JSBձոգչ    schedule 13.07.2010

В дополнение к индексации массива за пределами конца, как указал JS Bangs, вы также, вероятно, не хотите записывать весь chBuf в канал, поскольку в настоящее время вы записываете нулевой терминатор, а также любой мусор, который заполняет остальная часть массива после конца строки. Вы можете проверить длину полученной строки и записать только эту сумму.

person Brook Miles    schedule 13.07.2010