225上位机VC MFC打开运行外部程序直到其结束进程
225上位机VC MFC打开运行外部程序直到其结束进程 功能展示 时常我们的程序在调用外部的程序或自身的子模块时,在用户退出外部程序时,不想让用户操作我们的程序,我们当前例程实现调用外部程序功能,直到被调用的外部程序退出后我们的例程才响应用户的操作请求,效果如图; 要点提示 打开一程序直到其退出为止,此功能我们可以通过函数WaitForSingleObject()来实现 ; 函数原型WORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 参数说明: 1. hHandle[in]:对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。 2.dwMilliseconds[in]:定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回; 实现功能 1.新建基于对话框的应用程序 2.拖拽按钮<目录测试程序---等其结束><打开注册表---等其结束>关联函数 - void CGkbc8Dlg::OnOpen()
- {
- STARTUPINFO StartupInfo;
- PROCESS_INFORMATION ProInfo;
- memset(&StartupInfo,0,sizeof(StartupInfo));
- StartupInfo.cb = sizeof(StartupInfo);
- BOOL bResult = CreateProcess(NULL,"regedit.exe",NULL,NULL,TRUE,DETACHED_PROCESS,NULL,NULL,&StartupInfo,&ProInfo);
- if (bResult)
- WaitForSingleObject(ProInfo.hProcess,INFINITE);
- }
- void CGkbc8Dlg::OnOpen0()
- {
- char buf[MAX_PATH];
- GetModuleFileName(NULL,buf,MAX_PATH);
- CString sEXEPathName(buf);
- sEXEPathName=sEXEPathName.Left(sEXEPathName.ReverseFind('\\')+1);
- sEXEPathName+="test.exe";
- //<>
- STARTUPINFO StartupInfo;
- PROCESS_INFORMATION ProInfo;
- memset(&StartupInfo,0,sizeof(StartupInfo));
- StartupInfo.cb = sizeof(StartupInfo);
- BOOL bResult = CreateProcess(NULL,sEXEPathName.GetBuffer(0),NULL,NULL,TRUE,DETACHED_PROCESS,NULL,NULL,&StartupInfo,&ProInfo);
- if (bResult)
- WaitForSingleObject(ProInfo.hProcess,INFINITE);
- }
复制代码3.在WIN7等系统上打开注册表还得具有管理员权限,可添加例程根目录\res\AppName.exe.manifest到自己的工程目录下,载入到工程中,资源目录命名为24,资源命名为1,直接编辑直接双击生成的程序便可;AppName.exe.manifest文件为高版本编辑器生成的文件,在此复制使用即可; 我们来演示下功能实现的整个过程
|