如下是代码,注意看加红那段,竟然能够在非主线程里面调用UpdateData,我怎么整都整出来,运行到那里就出错,网上找了很久资料都说不能再非主线程里面调用UpdateData,给出的解决方法就是发消息到主窗口,然后自己添加消息响应,可是北极星同学没这么做就可以UpdateData了,困惑...
// 工作线程
DWORD WINAPI NewThread ( LPVOID lParam )
{
CPipeDlg* pDlg = (CPipeDlg*)lParam ;
WCHAR szSysDir[1024] ;
CString szCommand ;
// 取得系统目录
GetSystemDirectory ( szSysDir, sizeof(szSysDir) ) ;
// 格式化命令行参数
szCommand.Format ( L"%s\\ping.exe ", szSysDir ) ;
szCommand += pDlg->szParam ;
HANDLE hRead, hWrite ;
SECURITY_ATTRIBUTES saAttr; // 定义安全描述符
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// 创建管道,用于重定向ping程序的输出信息
if ( !CreatePipe(&hRead, &hWrite, &saAttr, 0) )
{
OutputDebugStringA ( "[ERROR]CreatePipe failed!" ) ;
return 0 ;
}
// 设置创建子进程的参数
PROCESS_INFORMATION pi ;
STARTUPINFO si = { sizeof(STARTUPINFO) } ;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW ;
si.hStdOutput = hWrite ;
si.hStdError = hWrite ;
si.wShowWindow = SW_HIDE ;
// 创建子进程
LPWSTR lpCommand = szCommand.GetBuffer(szCommand.GetLength()) ;
if ( CreateProcess ( NULL, lpCommand, NULL, NULL, TRUE, 0, NULL, szSysDir, &si, &pi ) )
{
// 管道的写入端已经传递给子进程,可以关闭在本进程的句柄
CloseHandle ( hWrite ) ;
// 从管道读取数据
// 此时子进程使用写入端向管道写入数据,本进程使用读取端从管道读取数据
DWORD dwTotalBytes = 0, dwReadBytes ;
char pBuf[1024] ={0} ;
pDlg->szOutput += "=======================================================\n" ;
while ( TRUE )
{
memset ( pBuf, 0, sizeof(pBuf) ) ;
if ( !ReadFile ( hRead, pBuf, sizeof(pBuf)-1, &dwReadBytes, NULL ) )
break ;
if ( dwReadBytes > 0 )
{
pDlg->szOutput += pBuf ;
pDlg->UpdateData ( FALSE ) ;
}
}
}
CloseHandle ( hRead ) ;
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)