如何执行一个进程,并挂起自己直到那个进程结束,才执行下一步操作

luoxiangdong 2004-06-25 02:54:35
如题
...全文
534 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoxiangdong 2004-07-19
  • 打赏
  • 举报
回复
谢谢各位了
lmfweng 2004-07-02
  • 打赏
  • 举报
回复
up
fzd999 2004-07-02
  • 打赏
  • 举报
回复
呵呵,好热闹~
Kudeet 2004-06-28
  • 打赏
  • 举报
回复
创建进程的函数为CreateProcess,该函数比较复杂共有十个参数。

BOOL CreateProcess(
LPCTSTR lpApplicationName, // 执行程序文件名
LPTSTR lpCommandLine, // 参数行
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全参数
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全参数
BOOL bInheritHandles, // 继承标记
DWORD dwCreationFlags, // 创建标记
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该子进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 创建该子进程的相关参数
LPPROCESS_INFORMATION lpProcessInformation // 创建后用于被创建子进程的信息
);
lpApplicationName:为执行程序的文件名,如果在创建进程时要使用参数,则该参数可以为NULL。

lpCommandLine:为参数行,如果无参数可以为NULL,在有参数传递给进程时如下设置:lpApplicationName=NULL;lpCommandLine=para,例如lpCommandLine="c:\\windows\\notepad.exe c:\\autoexec.bat"。

lpProcessAttributes,lpThreadAttributes:分别描述了创建的进程和线程安全属性,如果使用NULL表示使用默认的安全描述。

bInheritHandles:表示当前进程中的打开的句柄是否能够被创建的子进程所继承。

dwCreationFlags:表示创建标记,通过该标记可以设置进程的创建状态和优先级别。常用的有下面的标记:

CREATE_NEW_CONSOLE:为子进程创建一个新的控制台。
CREATE_SUSPENDED:子进程在创建时为挂起状态。
HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS:高/普通优先级别。
lpEnvironment:表示子进程所使用的环境变量,如果为NULL,则表示与当前进程使用相同的环境变量。

lpCurrentDirectory:表示子进程运行的初始目录。

lpStartupInfo:用于在创建子进程时设置各种属性。该结构定义如下:

typedef struct _STARTUPINFO { // si
DWORD cb; //结构长度
LPTSTR lpReserved; //保留
LPTSTR lpDesktop; //保留
LPTSTR lpTitle; //如果为控制台进程则为显示的标题
DWORD dwX; //窗口位置
DWORD dwY; //窗口位置
DWORD dwXSize; //窗口大小
DWORD dwYSize; //窗口大小
DWORD dwXCountChars; //控制台窗口字符号宽度
DWORD dwYCountChars; //控制台窗口字符号高度
DWORD dwFillAttribute; //控制台窗口填充模式
DWORD dwFlags; //创建标记
WORD wShowWindow; //窗口显示标记如同ShowWindow中的标记
WORD cbReserved2; //
LPBYTE lpReserved2; //
HANDLE hStdInput; //标准输入句柄
HANDLE hStdOutput; //标准输出句柄
HANDLE hStdError; //标准错误句柄
} STARTUPINFO, *LPSTARTUPINFO;

如果要使结构中相关的分量起作用,必须正确的设置dwFlags。例如:dwFlags包含STARTF_USESIZE表示dwXSize和dwYSize有效,包含STARTF_USEPOSITION表示dwX和dwY有效。

lpProcessInformation:用来在进程创建后接收相关信息,该结构由系统填写。

typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess; //进程句柄
HANDLE hThread; //进程的主线程句柄
DWORD dwProcessId; //进程ID
DWORD dwThreadId; //进程的主线程ID
} PROCESS_INFORMATION;
fenghuozhijin 2004-06-28
  • 打赏
  • 举报
回复
我createprocess()返回0,怎么办呀?能不能举个具体的例子。
fenghuozhijin 2004-06-28
  • 打赏
  • 举报
回复
EVC下实现了,可是有几个参数看不明白。不好意思,菜鸟一个。
lianglp 2004-06-28
  • 打赏
  • 举报
回复
呵呵,楼上说得很清楚了。
fenghuozhijin 2004-06-27
  • 打赏
  • 举报
回复
不错不错.
功名半纸 2004-06-26
  • 打赏
  • 举报
回复
都说完了!!!没得说了!^_^

HANDLE hprocess = CreateProcess(……);
WaitForSingleObject(hprocess, INFINITE);

进程不退出则wait不返回

Wenxy1 2004-06-26
  • 打赏
  • 举报
回复
呵呵,顺便看看。
zhang_zhibin 2004-06-26
  • 打赏
  • 举报
回复
办法不少,都可以
btbq 2004-06-26
  • 打赏
  • 举报
回复
使用事件对象,用于线程间通信:

如:

CEvent threadStart;//定义全局变量

……

::WaitForSingleObject(threadStart.m_hObject,INFINITE);//无限时间阻塞当前线程

……

threadStart.SetEvent();//在另一个线程结束时调用,即可取消上一线程的阻塞
vcforever 2004-06-26
  • 打赏
  • 举报
回复
使用CreateProcess来启动进程
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
该函数的最后一个参数是一个指向PROCESS_INFORMATION结构的指针,当使用CreateProcess启动进程之后,该结构就会被填充(记录下了所启动进程的信息)
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;

然后你可以在你的主进程中使用WaitForSingleObject函数来等待子进程,当子进程结束后,WaitForSingleObject函数才返回,这样就可以达到楼主的要求了!

例如:

PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(PROCESS_INFORMATION));
CreatePorcess("test.exe",...,&processInfo);
WaitForSingleObject(processInfo.hProcess, INFINITE);

这样就可以达到要求了!

希望对你又所帮助!
halk 2004-06-25
  • 打赏
  • 举报
回复
哦,错了错了,hprocess不是函数返回的,而是在最后一个参数的PROCESS_INFORMATION结构中返回。
halk 2004-06-25
  • 打赏
  • 举报
回复
等待进程对象。

HANDLE hprocess = CreateProcess(……);
WaitForSingleObject(hprocess, INFINITE);

进程不退出则wait不返回

15,471

社区成员

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

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