我的应用程序用CreateProcess调用很多其它程序。我想在退出这个程序时判断其它程序是否在运行!若是则终止这些程序?我应该用什么办法实现? 我用什么函数来终止这些程序呀?用ExitProgress吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OpenProcess (PROCESS_TERMINATE,bInherit,dwProcessId)得到Handle,然后TerminateProcess(). 我手头上有个程序,你的EMAIL是多少?我的[email protected] 在线耗子: 我已给你发了EMAIL,请把你的程序给我看看! 谢谢! microstar: MSDN上说最好用ExitProcess来终止程序,不推荐使用TerminateProcess.可是函数ExitProcess好象不针对某个进程来终止。如果我在某个按钮上多次点击启动同一个程序的多个进程,我怎么来一个一个终止呢? 5. 如何正确使用CreateProcess函数?(1) LPCTSTR lpApplicationName想运行的可执行文件的名字的字符串(应含扩展名)。如果找不到该文件,CreateProcess运行失败。应该设为NULL。(2) LPTSTR lpCommandLine传递给新进程的命令行字符串,应当为非常量字符串的地址。可以设定一个完整的命令行,如果第一个标记没有扩展名,CreateProcess将其假设为.exe。如果找不到该文件,CreateProcess按环境设置目录搜索运行。(3) LPSECURITY_ATTRIBUTES 设定进程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)(4) LPSECURITY_ATTRIBUTES lpThreadAttributes设定线程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)(5) BOOL bInheritHandles决定子进程对父进程继承性,一般设为FALSE。(6) DWORD dwCreationFlags用于标识标志,以便用于规定如何来创建新进程。标志 说明EBUG_PROCESS 父进程想要调试子进程和子进程将来生成的任何进程。当任何子进程(被调试进程)中发生某些事件时,将情况通知父进程。 (不明白)DEBUG_ONLY_THIS_PROCESS 与DEBUG_PROCESS标志相类似,调试程序只被告知紧靠父进程的子进程中发生的特定事件。 (不明白)CREATE_SUSPENDED 新进程被创建,但是,它的主线程则被挂起。DETACHED_PROCESS 阻止基于CUI的进程对它的父进程的控制台窗口的访问,并告诉系统将它的输出发送到新的控制台窗口。CREATE_NEW_CONSOLE 为新进程创建一个新控制台窗口。如果同时设定CREATE_NEW_CONSOLE和DETACHED_PROCESS标志,就会产生一个错误。CREATE_NO_WINDOW 不为应用程序创建任何控制台窗口。CREATE_NEW_PROCESS_GROUP 修改用户在按下Ctrl+C或Ctrl+Break键时得到通知的进程列表。CREATE_DEFAULT_ERROR_MODE 不继承父进程使用的错误模式。CREATE_SEPARATE_WOW_VDM 只能当你在Windows2000上运行16位Windows应用程序时使用。告诉系统创建一个单独的DOS虚拟机(VDM),并且在该VDM中运行16位Windows应用程序。 (不明白)CREATE_SHARED_WOW_VDM 只能当你在Windows2000上运行16位Windows应用程序时使用。在系统的共享VDM中运行16位Windows应用程序。 (不明白)CREATE_UNICODE_ENVIRONMENT 告诉系统,子进程的环境块应该包含Unicode字符。按照默认设置,进程的环境块包含的是ANSI字符串。CREATE_FORCEDOS 强制系统运行嵌入16位OS/2应用程序的MOS-DOS应用程序。CREATE_BREAKAWAY_FROM_JOB 使作业中的进程生成一个与作业相关联的新进程 (不明白)。IDLE_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSNORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSREALTIME_PRIORITY_CLASS 空闲低于正常(Windows2000)正常高于正常(Windows2000)高实时对于大多数应用程序来说不应该设定优先级类。(7) LPVOID lpEnvironment指向包含新进程将要使用的环境字符串的内存块。在大多数情况下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以使用GetEnvironmentStrings函数当不再需要该内存块时,应该调用FreeEnvironmentStrings函数将内存块释放。(8) LPCTSTR lpCurrentDirectory设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么必须指向包含需要的工作驱动器和工作目录的以0 结尾的字符串。注意,必须设定路径中的驱动器名。(9) LPSTARTUPINFO lpStartupInfo使用时应首先进行初始化。成员 窗口/控制台 作用cb 两者兼有 用作版本控制手段。必须初始化为sizeof(STARTUPINFO)lpReserved 两者兼有 保留。必须初始化为NULL (不为NULL也可以)lpDesktop 两者兼有 标识启动应用程序所在桌面的名字。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。其值为NULL时,与当前桌面相关联。 (不明白)lpTitle 控制台 设定控制台窗口的名称。其值为NULL,则把可执行文件的名字用作窗口名。dwXdwY 两者兼有 设定应用程序窗口在屏幕上的位置(以像素为单位)。只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。dwXSizedwYsize 两者兼有 设定应用程序窗口的宽度和长度(以像素为单位)只有当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。dwXCountCharsdwYCountChars 控制台 设定子应用程序的控制台窗口的宽度和高度(以字符为单位)dwFillAttribute 控制台 设定控制台窗口的文本和背景颜色dwFlags 两者兼有 后面以表格说明。wShowWindow 窗口 设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。cbReserved2 两者兼有 保留。必须被初始化为0 (非0也可以)lpReserved2 两者兼有 保留。必须被初始化为NULL (为什么)hStdInputhStdOutputhStdError 控制台 设定控制台输入输出缓存的句柄。照默hStdInput标识键盘缓存,hStdOutput和hStdError标识控制台窗口缓存。dwFlags使用方法:标志 含义STARTF_USESIZE 使用dwXSize和dwYSize成员STARTF_USESHOWWINDOW 使用wShowWindow成员STARTF_USEPOSITION 使用dwX和dwY成员STARTF_USECOUNTCHARS 使用dwXCountChars和dwYCountChars成员STARTF_USEFILLATTRIBUTE 使用dwFillAttribute成员STARTF_USESTDHANDLES 使用hStdInput、hStdOutput和hStdError成员STARTF_RUN_FULLSCREEN 强制在x86计算机上运行的控制台应用程序以全屏幕方式运行STARTF_FORCEONFEEDBACK 启动进程时,临时将系统的箭头光标改为沙漏箭头光标。STARTF_FORCEOFFFEEDBACK 启动进程时,不将光标改为沙漏。(10) LPPROCESS_INFORMATION lpProcessInformation新进程的返回信息。hProcess为新进程内核对象的句柄;hThread为新线程内核对象的句柄。在使用后应当用CloseHandle释放,使该内核的使用计数减一。dwProcessId新进程ID号;dwThreadId新线程ID号。0不能为ID号。虽然系统不会同时有相同的ID号,但是当一个进程的内核句柄被释放后其ID号又可能被新的进程使用。若要确保进程ID或线程ID不被重复使用,唯一的方法是保证进程或线程的内核对象不会被撤消。如果刚刚创建了一个新进程或线程,只要不关闭这些对象的句柄,就能够保证进程对象不被撤消。一旦应用程序结束使用该ID,那么调用CloseHandle就可以释放内核对象,要记住,这时使用或依赖进程ID,对来说将不再安全。如果使用的是子进程,将无法保证父进程或父线程的有效性,除非父进程复制了它自己的进程对象或线程对象的句柄,并让子进程继承这些句柄。 7. 如何终止进程的运行?(1) 使主线程的进入点函数返回(最好使用这个方法)。这是保证所有线程资源能够得到正确清除的唯一办法。让主线程的进入点函数返回,可以确保下列操作的实现:•该线程创建的任何C++对象将能使用它们的析构函数正确地撤消。•操作系统将能正确地释放该线程的堆栈使用的内存。•系统将进程退出代码(在进程的内核对象中维护)设为进入点函数返回值。•系统将进程内核对象的使用计数递减1。(2) 进程中的一个线程调用ExitProcess函数(应该避免使用这种方法)。显式调用ExitProcess和ExitThread是程序不能正确将自己清除的常见原因。调用ExitThread时,进程将继续运行,但可能会泄漏内存或其他资源。(3) 另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。(4) 进程中的所有线程自行终止运行(这种情况几乎从未发生)。如果进程中的所有线程全部终止运行,操作系统就认为没有理由继续保留进程的地址空间。一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。 关于VARIANT 和float 关于directshow的应用 请问怎么在自定义函数调用CAboutDlg窗口的控件 视图缩放后视图上图形更新问题 俠之大者請進fprintf為什麼輸出的是2行 新建分割窗口视图的问题... 求助:怎样才能得到键盘的扫描码? 如何响应键盘的ENTER消息? 一个listCtrl的小问题,解决马上结贴! 书上常用“堆栈”一词,难道堆和栈是一回事吗? softice的显示字体太小,怎样调大,用那个命令 谁能告诉我CreateProcess怎么样,最好给我个最简单的例子,比如说打开记事本
我已给你发了EMAIL,请把你的程序给我看看!
谢谢!
MSDN上说最好用ExitProcess来终止程序,不推荐使用TerminateProcess.
可是函数ExitProcess好象不针对某个进程来终止。如果我在某个按钮上多次点击启动同一个程序的多个进程,我怎么来一个一个终止呢?
(1) LPCTSTR lpApplicationName
想运行的可执行文件的名字的字符串(应含扩展名)。如果找不到该文件,CreateProcess运行失败。应该设为NULL。
(2) LPTSTR lpCommandLine
传递给新进程的命令行字符串,应当为非常量字符串的地址。可以设定一个完整的命令行,如果第一个标记没有扩展名,CreateProcess将其假设为.exe。如果找不到该文件,CreateProcess按环境设置目录搜索运行。
(3) LPSECURITY_ATTRIBUTES
设定进程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)
(4) LPSECURITY_ATTRIBUTES lpThreadAttributes
设定线程对象的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。 (不明白)
(5) BOOL bInheritHandles
决定子进程对父进程继承性,一般设为FALSE。
(6) DWORD dwCreationFlags
用于标识标志,以便用于规定如何来创建新进程。
标志 说明
EBUG_PROCESS 父进程想要调试子进程和子进程将来生成的任何进程。当任何子进程(被调试进程)中发生某些事件时,将情况通知父进程。 (不明白)
DEBUG_ONLY_THIS_PROCESS 与DEBUG_PROCESS标志相类似,调试程序只被告知紧靠父进程的子进程中发生的特定事件。 (不明白)
CREATE_SUSPENDED 新进程被创建,但是,它的主线程则被挂起。
DETACHED_PROCESS 阻止基于CUI的进程对它的父进程的控制台窗口的访问,并告诉系统将它的输出发送到新的控制台窗口。
CREATE_NEW_CONSOLE 为新进程创建一个新控制台窗口。如果同时设定CREATE_NEW_CONSOLE和DETACHED_PROCESS标志,就会产生一个错误。
CREATE_NO_WINDOW 不为应用程序创建任何控制台窗口。
CREATE_NEW_PROCESS_GROUP 修改用户在按下Ctrl+C或Ctrl+Break键时得到通知的进程列表。
CREATE_DEFAULT_ERROR_MODE 不继承父进程使用的错误模式。
CREATE_SEPARATE_WOW_VDM 只能当你在Windows2000上运行16位Windows应用程序时使用。告诉系统创建一个单独的DOS虚拟机(VDM),并且在该VDM中运行16位Windows应用程序。 (不明白)
CREATE_SHARED_WOW_VDM 只能当你在Windows2000上运行16位Windows应用程序时使用。在系统的共享VDM中运行16位Windows应用程序。 (不明白)
CREATE_UNICODE_ENVIRONMENT 告诉系统,子进程的环境块应该包含Unicode字符。按照默认设置,进程的环境块包含的是ANSI字符串。
CREATE_FORCEDOS 强制系统运行嵌入16位OS/2应用程序的MOS-DOS应用程序。
CREATE_BREAKAWAY_FROM_JOB 使作业中的进程生成一个与作业相关联的新进程 (不明白)。
IDLE_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSNORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSREALTIME_PRIORITY_CLASS 空闲低于正常(Windows2000)正常高于正常(Windows2000)高实时
对于大多数应用程序来说不应该设定优先级类。
(7) LPVOID lpEnvironment
指向包含新进程将要使用的环境字符串的内存块。在大多数情况下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以使用GetEnvironmentStrings函数当不再需要该内存块时,应该调用FreeEnvironmentStrings函数将内存块释放。
(8) LPCTSTR lpCurrentDirectory
设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么必须指向包含需要的工作驱动器和工作目录的以0 结尾的字符串。注意,必须设定路径中的驱动器名。
(9) LPSTARTUPINFO lpStartupInfo
使用时应首先进行初始化。
成员 窗口/控制台 作用
cb 两者兼有 用作版本控制手段。必须初始化为sizeof(STARTUPINFO)
lpReserved 两者兼有 保留。必须初始化为NULL (不为NULL也可以)
lpDesktop 两者兼有 标识启动应用程序所在桌面的名字。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。其值为NULL时,与当前桌面相关联。 (不明白)
lpTitle 控制台 设定控制台窗口的名称。其值为NULL,则把可执行文件的名字用作窗口名。
dwXdwY 两者兼有 设定应用程序窗口在屏幕上的位置(以像素为单位)。只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。
dwXSizedwYsize 两者兼有 设定应用程序窗口的宽度和长度(以像素为单位)只有当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。
dwXCountCharsdwYCountChars 控制台 设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
dwFillAttribute 控制台 设定控制台窗口的文本和背景颜色
dwFlags 两者兼有 后面以表格说明。
wShowWindow 窗口 设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。
cbReserved2 两者兼有 保留。必须被初始化为0 (非0也可以)
lpReserved2 两者兼有 保留。必须被初始化为NULL (为什么)
hStdInputhStdOutputhStdError 控制台 设定控制台输入输出缓存的句柄。照默hStdInput标识键盘缓存,hStdOutput和hStdError标识控制台窗口缓存。
dwFlags使用方法:
标志 含义
STARTF_USESIZE 使用dwXSize和dwYSize成员
STARTF_USESHOWWINDOW 使用wShowWindow成员
STARTF_USEPOSITION 使用dwX和dwY成员
STARTF_USECOUNTCHARS 使用dwXCountChars和dwYCountChars成员
STARTF_USEFILLATTRIBUTE 使用dwFillAttribute成员
STARTF_USESTDHANDLES 使用hStdInput、hStdOutput和hStdError成员
STARTF_RUN_FULLSCREEN 强制在x86计算机上运行的控制台应用程序以全屏幕方式运行
STARTF_FORCEONFEEDBACK 启动进程时,临时将系统的箭头光标改为沙漏箭头光标。
STARTF_FORCEOFFFEEDBACK 启动进程时,不将光标改为沙漏。
(10) LPPROCESS_INFORMATION lpProcessInformation
新进程的返回信息。hProcess为新进程内核对象的句柄;hThread为新线程内核对象的句柄。在使用后应当用CloseHandle释放,使该内核的使用计数减一。dwProcessId新进程ID号;dwThreadId新线程ID号。0不能为ID号。虽然系统不会同时有相同的ID号,但是当一个进程的内核句柄被释放后其ID号又可能被新的进程使用。若要确保进程ID或线程ID不被重复使用,唯一的方法是保证进程或线程的内核对象不会被撤消。如果刚刚创建了一个新进程或线程,只要不关闭这些对象的句柄,就能够保证进程对象不被撤消。一旦应用程序结束使用该ID,那么调用CloseHandle就可以释放内核对象,要记住,这时使用或依赖进程ID,对来说将不再安全。如果使用的是子进程,将无法保证父进程或父线程的有效性,除非父进程复制了它自己的进程对象或线程对象的句柄,并让子进程继承这些句柄。
(1) 使主线程的进入点函数返回(最好使用这个方法)。
这是保证所有线程资源能够得到正确清除的唯一办法。
让主线程的进入点函数返回,可以确保下列操作的实现:
•该线程创建的任何C++对象将能使用它们的析构函数正确地撤消。
•操作系统将能正确地释放该线程的堆栈使用的内存。
•系统将进程退出代码(在进程的内核对象中维护)设为进入点函数返回值。
•系统将进程内核对象的使用计数递减1。
(2) 进程中的一个线程调用ExitProcess函数(应该避免使用这种方法)。
显式调用ExitProcess和ExitThread是程序不能正确将自己清除的常见原因。调用ExitThread时,进程将继续运行,但可能会泄漏内存或其他资源。
(3) 另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。
只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。
(4) 进程中的所有线程自行终止运行(这种情况几乎从未发生)。
如果进程中的所有线程全部终止运行,操作系统就认为没有理由继续保留进程的地址空间。
一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。