MFC串口通信软件进展匿名管道通信失败,提示0x000000b4不能读
MFC串口通信软件进行匿名管道通信失败,提示0x000000b4不能读
我将管道通信的代码单独用在一个工程里面,只实现读取cmd中的命令,可以正常工作,但是我把它用在我的串口通信软件里面时,就提示““0x004959f0”指令引用的"0x00000078"内存,该内存不能为read。管道通信代码如下:
unsigned __stdcall CmdThread(void *pParam)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CString strCmd;
g_dlg->m_ctrlPING.GetWindowText(strCmd);//从控件获得cmd命令串
strCmd="cmd /k"+strCmd;//加上"cmd /k"是为了能执行类似dir的命令
if(strCmd.IsEmpty())
{
return TRUE;
}
//创建命名管道
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
//MessageBox("Error On CreatePipe()");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;//数据输出用的文件句柄
si.hStdOutput = hWrite;//数据输出用的文件句柄
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
OutputDebugString("1");
if (!CreateProcess(NULL,strCmd.GetBuffer(strCmd.GetLength())//执行cmd命令,并在命名中管道中写入cmd命令返回的串
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
//MessageBox("Error on CreateProcess()");
return FALSE;
}
/*if(WaitForSingleObject(pi.hProcess, INFINITE)==WAIT_FAILED)//这里决定是否要等整个命令执行完,如ping等耗时较多的命令.
{
//MessageBox("Failed!");
return FALSE;
}*/
CloseHandle(hWrite);
OutputDebugString("2");
char buffer[4096] ={0} ;
DWORD bytesRead;
CString strResult="";
while(1)
{
memset(buffer,0,4096);
if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
{
strResult += buffer;
g_dlg->m_ctrlORDER.SetWindowText(strResult);//显示到界面上去
OutputDebugString(buffer);
}
else
{
break;
}
}
CloseHandle(hRead);
return TRUE;
}
void PEIZHI::OnButton5()
{
// TODO: Add your control notification handler code here
_beginthreadex(NULL,0,CmdThread,NULL,0,NULL);
//GuandaoCmd();
}
因为从没接触过管道通信,就从论坛里面用的现成的,我单独建了一个工程试了下,没问题,能实现我想要的功能。就是用在我的串口通信软件里面就出错误了,请大神解决下啊。
------解决思路----------------------
代码断在了哪一行?
------解决思路----------------------
出现错误的时候,选重试,然后查看一下call stack实在哪句代码出错
你的代码有几处都是有隐患
比如
if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
{
strResult += buffer;
如果buffer读取到了4096字节,你再strResult += buffer就内存访问越界了
还有你怎么把hWrite先给CloseHandle了?
这样还能读吗?
------解决思路----------------------
按F5来运行程序,看看断在哪一行
我将管道通信的代码单独用在一个工程里面,只实现读取cmd中的命令,可以正常工作,但是我把它用在我的串口通信软件里面时,就提示““0x004959f0”指令引用的"0x00000078"内存,该内存不能为read。管道通信代码如下:
unsigned __stdcall CmdThread(void *pParam)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CString strCmd;
g_dlg->m_ctrlPING.GetWindowText(strCmd);//从控件获得cmd命令串
strCmd="cmd /k"+strCmd;//加上"cmd /k"是为了能执行类似dir的命令
if(strCmd.IsEmpty())
{
return TRUE;
}
//创建命名管道
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
//MessageBox("Error On CreatePipe()");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;//数据输出用的文件句柄
si.hStdOutput = hWrite;//数据输出用的文件句柄
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
OutputDebugString("1");
if (!CreateProcess(NULL,strCmd.GetBuffer(strCmd.GetLength())//执行cmd命令,并在命名中管道中写入cmd命令返回的串
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
//MessageBox("Error on CreateProcess()");
return FALSE;
}
/*if(WaitForSingleObject(pi.hProcess, INFINITE)==WAIT_FAILED)//这里决定是否要等整个命令执行完,如ping等耗时较多的命令.
{
//MessageBox("Failed!");
return FALSE;
}*/
CloseHandle(hWrite);
OutputDebugString("2");
char buffer[4096] ={0} ;
DWORD bytesRead;
CString strResult="";
while(1)
{
memset(buffer,0,4096);
if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
{
strResult += buffer;
g_dlg->m_ctrlORDER.SetWindowText(strResult);//显示到界面上去
OutputDebugString(buffer);
}
else
{
break;
}
}
CloseHandle(hRead);
return TRUE;
}
void PEIZHI::OnButton5()
{
// TODO: Add your control notification handler code here
_beginthreadex(NULL,0,CmdThread,NULL,0,NULL);
//GuandaoCmd();
}
因为从没接触过管道通信,就从论坛里面用的现成的,我单独建了一个工程试了下,没问题,能实现我想要的功能。就是用在我的串口通信软件里面就出错误了,请大神解决下啊。
------解决思路----------------------
代码断在了哪一行?
------解决思路----------------------
出现错误的时候,选重试,然后查看一下call stack实在哪句代码出错
你的代码有几处都是有隐患
比如
if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
{
strResult += buffer;
如果buffer读取到了4096字节,你再strResult += buffer就内存访问越界了
还有你怎么把hWrite先给CloseHandle了?
这样还能读吗?
------解决思路----------------------
按F5来运行程序,看看断在哪一行