将读取到的匿名管道的数据显示在EDIT BOX的时候数据怎么截断了???

zfm850906 2008-04-25 12:21:16
我的问题是这样的:
我建立一个匿名管道,然后用CreateProcess启动了子进程,这个子进程是
VC的编译器cl.exe。我用这个编译器编译了一个Hello.cpp的文件,我现在要获得它的输出内容,我确实获得了它的内

容并且把这个内容放在了一个字符数组里,接下来就把这个获得的内容显示到我EDIT BOX里了,问题就出现在EDIT BOX

里显示的内容被截断了,只显示其中的第一句,后面的全部没有显示出来。这是怎么回事啊???
我用了很多方法都行不通,请各位大侠帮忙指点迷津啊。先谢谢啦。

我写的代码是:
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
if(!CreatePipe(&hRead,&hWrite,&sa,0))
{
MessageBox("创建匿名管道失败!");
return;
}




STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb=sizeof(STARTUPINFO);
sui.wShowWindow=SW_HIDE;
sui.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
//sui.hStdInput=hRead;
sui.hStdOutput=hWrite;
sui.hStdError=hWrite;

if(!CreateProcess("C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin\\CL.EXE","cl

Hello.cpp",NULL,NULL,
TRUE,0,NULL,"G:\\study\\Hello例子",&sui,&pi))
{
CloseHandle(hRead);
CloseHandle(hWrite);
hRead=NULL;
hWrite=NULL;
MessageBox("创建子进程失败!");
return;
}
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

DWORD dwRead;


char buf[1024];
memset(buf,0,sizeof(buf));

if(!ReadFile(hRead,buf,1024,&dwRead,NULL)||dwRead==0)
{
MessageBox("读取数据失败!");
return;
}

SetDlgItemText(IDC_EDIT1,buf);

但是最终显示到IDC_EDIT1里的内容只有所用内容的第一句,我调试运行的时候知道了buf里的所有内容。但就是不能全

部显示出来。大侠帮帮忙啊。
...全文
114 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanghao58686763 2008-04-28
  • 打赏
  • 举报
回复
不懂,帮忙顶上去,有知道的快来帮忙~~·
zfm850906 2008-04-28
  • 打赏
  • 举报
回复
先谢谢大家。我在试一下。
cnzdgs 2008-04-28
  • 打赏
  • 举报
回复
信息显示不全是因为你创建进程后立即读管道,没有等待,而且只读了一次,这个时候新进程只输出了一点信息,或者完全没有输出。你应该循环读取信息并显示,如果你只需要运行结果,可以用WaitForSingleObject等待进程句柄,然后再读管道。
另外,进程输出到控制台的字符本身就是含有\r的,不需要再替换。还有,你CreateProcess这行代码好象还有问题,自己检查一下。
zgl7903 2008-04-27
  • 打赏
  • 举报
回复
拷贝一段有几行文字的内容,粘贴到Edit Box中,看看是否显示正常,如果显示正常就是读取文件上有问题,如果不正常在控件显示上下点功夫
调试一下很容易发现问题的
zfm850906 2008-04-26
  • 打赏
  • 举报
回复
我利用replace将\n换成了\r\n,但还是不行,
帮忙想象办法呀。先谢谢了。
zgl7903 2008-04-25
  • 打赏
  • 举报
回复
在EDit控件的风格中选中MultiLine
zgl7903 2008-04-25
  • 打赏
  • 举报
回复
LPCTSTR lpString 中可以包含换行
注意EDIT BOX认得换行符是 "\r\n"
可能是LZ的换行符不对
zfm850906 2008-04-25
  • 打赏
  • 举报
回复
先谢谢楼上的。
我的问题是这样的:我已经将EDit控件的风格中选中MultiLine,我得到的数据放在了一个字符数组buf里,然后GetDlgItem(IDC_EDIT1)->SetWindowText(buf);但是在显示输出从管道里获得的字符串时只能输出其中的一句,其他的就被截断了,不知道是怎么回事?我还查看了SetWindowText这个函数,
BOOL SetWindowText(
HWND hWnd, // handle to window or control
LPCTSTR lpString // address of string
);

Parameters
hWnd
Handle to the window or control whose text is to be changed.
lpString
Pointer to a null-terminated string to be used as the new title or control text.
其中他第二个参数是指向个非终止的字符串,他的意思是不是只能输出一个没有换行的字符串,换行之后的之后的字符串就被截断了。
如果是这样的话那要调用什么函数能将所有字符串都输出来,包括换行之后的字符串也能输出来。
谢谢大家了。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧