首页
社区
课程
招聘
[求助]关于使用匿名管道重定向程序输出的问题
发表于: 2008-12-6 20:29 6371

[求助]关于使用匿名管道重定向程序输出的问题

2008-12-6 20:29
6371
如下是代码,注意看加红那段,竟然能够在非主线程里面调用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期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
CPipeDlg* pDlg = (CPipeDlg*)lParam ;他是不是传了一个窗口句柄过来
2008-12-8 14:50
0
雪    币: 371
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyp
3
他把this传过去以后,还是不能再调用非主线程调用UpdateData,有个断言会出错~网上也有很多帖子说不能再非主线程调用UpdateData,可是这程序做到了 ,困惑
2008-12-8 22:44
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
4
没错,我在自己写的一个程序里,用过类似的代码,每次都出错...................
但是人家用的是VC 8编译的,应该是编译器能支持了
2009-2-4 11:03
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还在泉州吗?
2018-5-19 01:44
0
游客
登录 | 注册 方可回帖
返回
//