C++ “WinAPI写入”;编辑";对话框到管道(错误:围绕变量';x';的堆栈已损坏)
似乎我通过简单的多线程应用程序解决了我的大部分问题!但是,我遇到了一个小错误:“围绕变量“x”的堆栈已损坏。”它工作正常(在调试错误上点击abort之后),但显然我不能每次有人运行应用程序时都出错。这是相关的代码。它是对我的一个工作线程的回调C++ “WinAPI写入”;编辑";对话框到管道(错误:围绕变量';x';的堆栈已损坏),c++,multithreading,winapi,writefile,C++,Multithreading,Winapi,Writefile,似乎我通过简单的多线程应用程序解决了我的大部分问题!但是,我遇到了一个小错误:“围绕变量“x”的堆栈已损坏。”它工作正常(在调试错误上点击abort之后),但显然我不能每次有人运行应用程序时都出错。这是相关的代码。它是对我的一个工作线程的回调 DWORD WINAPI Arc_writePipe(LPVOID threadParam) { Arc_Redirect ar; DWORD dwWrote; CHAR chBuf[BUFSIZE]; HANDLE hPi
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\u NO\u DATA”之外,我没有得到任何GetLastError()输出,因此我假设它与我的WriteFile()有关;函数与BUFSIZE(在0x1000处定义)结合使用。所以基本上,我做错了什么。有人知道从编辑对话框获取信息并将其写入管道的更好方法吗
非常感谢你的帮助
关于,
丹尼斯M.我不知道腐败发生在哪里,所以我不知道到底是什么问题。但是,下面的一行是错误的:
chBuf[BUFSIZE] = '\0';
您使用大小
BUFSIZE
声明了chBuf
,这意味着索引BUFSIZE
实际上位于数组之外。这将导致堆栈损坏。您真正需要做的是chBuf[BUFSIZE-1]='\0'代码>我不知道损坏发生在哪里,所以我不知道问题到底出在哪里。但是,下面的一行是错误的:
chBuf[BUFSIZE] = '\0';
您使用大小BUFSIZE
声明了chBuf
,这意味着索引BUFSIZE
实际上位于数组之外。这将导致堆栈损坏。您真正需要做的是chBuf[BUFSIZE-1]='\0'代码>除了像JS Bangs指出的那样索引数组末尾之外,您可能还不想将整个chBuf写入管道,因为您当前正在写入空终止符以及任何填充数组剩余部分超过字符串末尾的垃圾。您可能希望检查检索到的字符串的长度,并只写入该长度。除了像JS Bangs指出的那样索引数组末尾之外,您还可能不希望将整个chBuf写入管道,当您当前正在写入空终止符以及填充数组剩余部分超过字符串结尾的任何垃圾时。您可能希望检查检索到的字符串的长度,并只写入该金额。我在代码中没有看到任何变量x
。正在损坏的实际变量是什么?我在代码中没有看到任何变量x
。被破坏的实际变量是什么?