WinAPI Записать диалог «Редактировать» в конвейер (ошибка: стек вокруг переменной 'x' поврежден) - PullRequest
0 голосов
/ 13 июля 2010

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

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).В общем, я делаю что-то не так.Кто-нибудь знает, возможно, лучший способ получить информацию из диалогового окна редактирования и записать ее в канал?

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

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

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

2 голосов
/ 13 июля 2010

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

chBuf[BUFSIZE] = '\0';

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

...