0

看来我只是通过对我的应用程序进行多线程处理来解决我的大部分问题!但是,我遇到了一点错误:“围绕变量'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;
}

有没有人知道为什么这个错误不断发生?在写入数据后,除了“ERROR_NO_DATA”之外,我没有得到任何 GetLastError() 输出,所以我假设它与我的 WriteFile(); 函数与 BUFSIZE(定义在 0x1000)一起使用。所以基本上,我做错了什么。有谁知道从编辑对话框中获取信息并将其写入管道的更好方法?

非常感谢你的帮助!

问候,
丹尼斯 M。

4

2 回答 2

2

我不知道腐败发生在哪里,所以我不知道究竟是什么问题。但是,以下行是错误的:

chBuf[BUFSIZE] = '\0';

您声明chBuf了大小BUFSIZE,这意味着索引 BUFSIZE实际上在数组之外。这将导致堆栈损坏。你真正需要做的是chBuf[BUFSIZE - 1] = '\0';

于 2010-07-13T04:31:05.463 回答
2

除了像 JS Bangs 指出的那样在末尾索引数组之外,您可能也不希望将整个 chBuf 写入管道,因为您当前正在写出空终止符以及填充的任何垃圾字符串末尾之后的数组的其余部分。您可能想要检查检索到的字符串的长度并仅写入该长度。

于 2010-07-13T04:40:52.263 回答