Chinaunix首页 | 论坛 | 博客
  • 博客访问: 578004
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:52:05

龙仪:GOOD
(发表于2004-4-18 22:52:00)

xiaojin:好,建议放到在线杂志中去。
(发表于2004-4-19 12:35:00)

Madlee:收藏先,不过我想应该可以不通过中间的那个进程直接读写子进程的io的。msdn里有个例子,我一直希望能把他封装成标准的stream,可惜水平不够。:(

(发表于2004-4-19 18:44:00)

wuhuaqiang:作者就是经常在《程序员》上发表文章的那个王咏刚。
我阅读作者的多篇技术文章,对作者的技术功底简直崇拜的要死:)
(发表于2004-4-21 17:51:00)

superdai:发现牛的程序员都很有文采。
可见知识是相通的。。。。。。

尔曰浅显,彼曰艰深,唯其深入,方可浅出。
(发表于2004-4-22 10:25:00)

童梦:这样是不是麻烦了一些?我觉得,既然CreateProcess中的STARTUPINFO结构体中可以指定标准输入输出流,那么,只需要把这个流传给子进程(即是那些命令行程序),然后再通过readfile来读取这个流,那不是更简捷吗?
(发表于2004-4-26 18:58:00)

我酷我用弱智王:唉, 还用中间程序啊. 直接在STARTUPINFO中指定一个管道的句柄就行了. 即不必用到临时文件,也不必用到中介程序.


(发表于2004-5-1 19:23:00)

chebyshe:请教各位:我刚刚接触管道,想实现进程交互通信,我在父程序中创建子进程和两个匿名管道,怎么输入的数据传递给子进程叫子进程来处理?我将标准输入设为一个管道的读句柄,然后由另一个管道传出来,怎么没反应?谢谢!
(发表于2004-5-4 21:41:00)

fanged:其他的还行,不过建议把刷新改为pDlg->m_edit1.LineScroll(pDlg->m_edit1.GetLineCount());
(发表于2004-7-22 12:06:00)

robin_fox_nan:有那么费劲么?真的累死了,其实可以这样做的:
void function()
{
HANDLE   hSTDINWrite, hSTDINRead;       // 用于重定向子进程输入的句柄   
HANDLE   hSTDOUTWrite, hSTDOUTRead;     // 用于重定向子进程输出的句柄   
SECURITY_ATTRIBUTES   sa;   
    
sa.bInheritHandle = TRUE;   
sa.lpSecurityDescriptor = NULL;   
sa.nLength = sizeof(sa);   

// 创建子进程输出匿名管道   
if( !CreatePipe(&hSTDOUTRead, &hSTDOUTWrite, &sa, 0) )   
{   
AfxMessageBox("Create   STDOUT   pipe   failed");   
return;   
}  

// 创建子进程输入匿名管道   
if( !CreatePipe(&hSTDINRead, &hSTDINWrite, &sa, 0) )   
{   
AfxMessageBox("Create   STDIN   pipe   failed");   
return;   
}
(发表于2006-8-27 20:50:00)

robin_fox_nan: PROCESS_INFORMATION  pi;   
ZeroMemory(&pi, sizeof(pi));   
STARTUPINFO  si; 
GetStartupInfo(&si);

si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES   |   STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdInput   =   hSTDINRead;      //重定向子进程输入   
    si.hStdOutput   =   hSTDOUTWrite;   //重定向子进程输入    
si.hStdError = hSTDOUTWrite; //GetStdHandle( STD_ERROR_HANDLE ); 

char cmd[20] = {0, };
::strcpy(cmd, "c:\\fport.exe");

if( !::CreateProcess(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) )   
{   
int errorNo = ::GetLastError();
AfxMessageBox("create process failed");   
return;   
}


(发表于2006-8-27 20:51:00)

robin_fox_nan:::CloseHandle(hSTDOUTWrite);   
::CloseHandle(hSTDINRead);

char strData[1024] = {0, };
DWORD dwBytes;
while(::ReadFile(hSTDOUTRead, strData, sizeof(strData), &dwBytes, NULL))
{   
strData[dwBytes] = '\0';
SetMessage(strData);
}   

::WaitForSingleObject(pi.hProcess, INFINITE);   
::CloseHandle(hSTDOUTRead);   
::CloseHandle(hSTDINWrite);   
::CloseHandle(pi.hProcess);   
::CloseHandle(pi.hThread);  
}// end of function
(发表于2006-8-27 20:52:00)

flyingxu:
补充:相反方向的信息传递
(发表于2006-9-15 15:35:00)

..........................................................................
--------------------next---------------------

阅读(211) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~