我在进程A中启动进程B,可以保留句柄,
通过GetExitCodeProcess不断查询。
但是,进程B的句柄会不会变无效(被释放?)什么时候?有没有什么其它方法,在B结束的时候通知A,而不是循环判断。
特别一点的是可能在A中启动上百个进程B C D……。另外:
A B C……这些进程都是我编写的。
我希望B C……都返回一个Resault(比如一个字符串吧)给A,
我要维护一张表,包括进程和它的返回结果。有什么方法可以容易的得到。
我想是写文件,然后A知道B终止了去读。但是效率可能不高。
不知道CreateProcess中LPSTARTUPINFO结构的那几个stdHadle怎么使用。
解决方案 »
- 为什么再次JPG压缩反而比原图大了
- 如何实现Shock wave flash控件播放的透明效果
- 有段程序大家帮我分析下
- HINSTANCE 是程序还是窗口句柄类型,如何得到一个的程序句柄
- 我的这个服务器,能同时与多个客户端通讯吗?
- 问个问题:在网页里面嵌入activeX时,activeX没法显示?
- Platform SDK ??? 平台sdk作用是什么??
- 关于串口解码器的几个问题
- 有个问题_T什么意思
- 请问在CCombox类中,用AddString("string")后如何在Combox中显示添加的string
- ActiveSkin问题:如何更改Form的Caption文字字体?
- 分割条问题?
WaitForSingleObject(hTarget, INFINTE);
WaitForSingleObject(hTarget, INFINTE);
typedef struct
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
CString title;
} PROCESSDATA, * LPPROCESSDATA;
CPtrArray array;
VOID Thread(LPVOID lParam)
{
DWORD exitCode;
int count;
LPPROCESSDATA ppd;
for(;;)
{
count=array.GetSize();
for(int i=0;i<count;i++)
{
ppd=(LPPROCESSDATA)array.GetAt(i);
if (GetExitCodeProcess(ppd->pi.hProcess, &exitCode))
{
if(exitCode==STILL_ACTIVE)
{
}
else
{
CString text;
text.Format("%s:ExitCode=%d",ppd->title,exitCode);
AfxGetApp()->m_pMainWnd->SetWindowText(text);
delete ppd;
array.RemoveAt(i);
break;
}
}
}
Sleep(1000);
}
}
void CheckInThread(LPCTSTR cmd)
{
LPPROCESSDATA ppd=new PROCESSDATA;
ppd->si.cb = sizeof(STARTUPINFO);
ppd->si.lpReserved = NULL;
ppd->si.lpReserved2 = NULL;
ppd->si.cbReserved2 = 0;
ppd->si.lpDesktop = NULL;
ppd->si.lpTitle = NULL;
ppd->si.dwFlags = 0;
ppd->si.dwX = 0;
ppd->si.dwY = 0;
ppd->si.dwFillAttribute = 0;
ppd->si.wShowWindow = SW_SHOW;
// 创建临时文件
TCHAR szTempPath[MAX_PATH];
DWORD dwResult=::GetTempPath(MAX_PATH,szTempPath);
ASSERT(dwResult);
TCHAR szTempFile[MAX_PATH];
UINT nResult=::GetTempFileName(szTempPath,_T("Text"),0,szTempFile);
ASSERT(nResult);
CFile file(szTempFile,CFile::modeCreate|CFile::modeWrite);
file.Write("等待你来关闭程序",16);
file.Close();
ppd->title=szTempFile;
ppd->title=ppd->title.Right(ppd->title.GetLength()-1-ppd->title.ReverseFind('\\'));
// 启动进程
char cmdText[MAX_PATH];
sprintf(cmdText,"Notepad %s",szTempFile);
CreateProcess(
NULL, // No module name (use command line).
cmdText, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&ppd->si, // Pointer to STARTUPINFO structure.
&ppd->pi ); // Pointer to PROCESS_INFORMATION structure.
if(array.GetSize()==0)
AfxBeginThread((AFX_THREADPROC)Thread,0,THREAD_PRIORITY_NORMAL,0,0,NULL);
array.Add(ppd);
}
void CCreateProcessDlg::OnButton()
{
CheckInThread("Notepad.exe");
}
lpProcessInformation
[out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process.
Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed. wangjinwang(王进)的这段代码也就利用了这一点,这我以前是不确定的。
判断进程终止,至少可以用轮询的方法来作。接下来就是后面的那个问题。当进程B有个字符串再结束时要返回给A,改如何做。
ExitCode只是个UINT的变量:(
精华区有一片再进程间传递字符串的帖子,但是大不开。
谁还有帮忙贴一下好吗。
而且我只是再结束时传递,有没有什么特别的方法可以用。3x