做怎么样的自己的网站,seo工作流程图,网站加入我们页面,o2o交易平台有哪些在这儿下载本节的所有源程序概述进程控制简单的说相当于在一个程序中执行另一个程序#xff0c;你可以把它想象成在 Dos 下用 int 21h/4bh 功能来执行另外一个程序#xff0c;如果单从执行另一个程序的目的来讲#xff0c;在 Windows 中有不少方法#xff0c;如使用 ShellE…在这儿下载本节的所有源程序概述进程控制简单的说相当于在一个程序中执行另一个程序你可以把它想象成在 Dos 下用 int 21h/4bh 功能来执行另外一个程序如果单从执行另一个程序的目的来讲在 Windows 中有不少方法如使用 ShellExecute 等但这些 Api 仅仅是“执行”而已进程控制的意义在于可以创建一个进程并可以通过进程句柄结束进程同样你也可以通过进程句柄来跟踪程序还可以用 ReadProcessMemory 和 WriteProcessMemory 来读写子进程的内存空间。进程控制要使用的相关 API 有下面这些创建进程的函数为CreateProcess该函数比较复杂共有十个参数但有个好消息是使用时大部分可以用 NULL。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为执行程序的文件名你也可以把执行文件名包括在下一个参数 lpCommandLine 中然后把该参数置为NULL。lpCommandLine为参数行如果无参数可以为NULL在有参数传递给进程时可以如下设置lpApplicationName文件名lpCommandLine参数或者 lpApplicationNameNULLlpCommandLine文件名 参数。lpProcessAttributeslpThreadAttributes分别描述了创建的进程和线程安全属性如果使用NULL表示使用默认的安全描述。bInheritHandles表示当前进程中的打开的句柄是否能够被创建的子进程所继承。dwCreationFlags表示创建标记通过该标记可以设置进程的创建状态和优先级别。常用的有下面的标记CREATE_NEW_CONSOLE为子进程创建一个新的控制台。CREATE_SUSPENDED子进程在创建时为挂起状态。如果指定了这个参数那么执行 CreateProcess 后进程只是被装入内存但不是马上开始执行而是必须等主程序调用 ResumeThread 后才继续执行。HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS高/普通优先级别。lpEnvironment表示子进程所使用的环境变量如果为NULL则表示与当前进程使用相同的环境变量。lpCurrentDirectory表示子进程运行的初始目录。lpStartupInfoSTARTUPINFO 结构用于在创建子进程时设置各种属性。lpProcessInformationPROCESS_INFORMATION 结构用来在进程创建后接收相关信息该结构由系统填写。调用 CreateProcess 函数有三个参数是必需的一在 lpApplicationName 或 lpCommandLine 指定文件名二是 lpStartupInfo 结构三是 PROCESS_INFORMATION 结构因为 PROCESS_INFORMATION 结构返回了进程建立后的句柄以后的一切操作将要用到这些返回的句柄它是由系统填写的结构说明如下typedef struct _PROCESS_INFORMATION {HANDLE hProcess; //进程句柄HANDLE hThread; //进程的主线程句柄DWORD dwProcessId; //进程IDDWORD dwThreadId; //进程的主线程ID} PROCESS_INFORMATION;另外还有一个关键的结构 STARTUPINFO该结构定义如下typedef struct STARTUPINFO {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有效等等。如果不是有特殊的要求我们不用自己去填写这个结构只需用 GetStartupInfo 让 Windows 为你填写好了这样建立一个进程的语句就是...stStartUp STARTUPINFO stProcInfo PROCESS_INFORMATION ?stProcInfo PROCESS_INFORMATION ?...invoke GetStartupInfo,addr stStartUpinvoke CreateProcess,NULL,addr szFileName,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo...如果成功的话eax 将返回非零值注意返回在 PROCESS_INFORMATION 结构中的 hProcess以后很多的操作都要用到它。强制结束一个进程的 API 为 TerminateProcessBOOL TerminateProcess(HANDLE hProcess, // 进程句柄UINT uExitCode // 退出代码);你可以使用语句 invoke TerminateProcess,structProcInfo.hProcess,0 来结束进程要注意的是如果可能的话尽量不要在程序中强制结束别的进程因为使用 TerminateProcess 结束的进程它装载的 dll 不能被正确卸载。这样可能会引起系统资源的无效占用。最好的办法在进程中自己使用 ExitProcess 退出。查询一个进程状态的 API 为 GetExitCodeProcess。BOOL GetExitCodeProcess(HANDLE hProcess, // handle to the processLPDWORD lpExitCode // address to receive termination status);如果进程尚未退出函数将会返回STILL_ACTIVE。这个 API 是马上返回的。等待进程执行可以用 WaitForSingleObject这个 API 并不是单用于进程的等待其它还可以用在线程等操作但我们一般用它来等待进程的执行它的申明是DWORD WaitForSingleObject(HANDLE hHandle, // handle of object to wait forDWORD dwMilliseconds // time-out interval in milliseconds);如果我们要等待进程执行 1 秒钟可以 invoke WaitForSingleObject,stProcInfo.hProcess,1000 如果要等到进程结束可以用 WaitForSingleObject,stProcInfo.hProcess,INFINITE 参数 2 中的 INFINITE 在 Windows.inc 中有定义意思是无穷等待。最后当不再使用进程句柄的时候不要忘了使用 CloseHandle 关闭 hProcess 和 hThread否则会浪费系统句柄的资源。源程序 - 汇编源文件.386.model flat, stdcalloption casemap :none ; case sensitive;; Include 数据;include windows.incinclude user32.incinclude kernel32.incinclude comctl32.incinclude comdlg32.incinclude gdi32.incincludelib user32.libincludelib kernel32.libincludelib comctl32.libincludelib comdlg32.libincludelib gdi32.lib;; Equ 数据;DLG_MAIN equ 3000;ID_BROWSE equ 3001ID_RUN equ 3002ID_EXIT equ 3003ID_TEXT equ 3004F_RUNNING equ 0001h ;进程在运行中;; 数据段;.data?stStartUp STARTUPINFO ?stProcInfo PROCESS_INFORMATION ?stOpenFileName OPENFILENAME ?hRunThread dd ?hInstance dd ?hWinMain dd ?hIcon dd ?szBuffer db 512 dup (?)dwFlag dd ?;.dataszExcute db 执行(E),0 ;按钮文字szKill db 终止(E),0szExcuteError db 启动应用程序错误,0szTitleOpen db Open executable file...,0szExt db *.exe,0szFilter db Excutable Files,0,*.exe;*.com,0db 0;; 代码段;.codeif DEBUGinclude Debug.asmendifinclude Win.asm;********************************************************************; 执行程序用的线程; 1. 用 CreateProcess 建立进程; 2. 用 WaitForSingleOject 等待进程结束;********************************************************************_RunThread proc uses ebx ecx edx esi edi,\dwParam:DWORDor dwFlag,F_RUNNING;********************************************************************; 取消“退出”按钮并把“执行”按钮改为“中止”;********************************************************************invoke GetDlgItem,hWinMain,ID_EXITinvoke EnableWindow,eax,FALSEinvoke SendDlgItemMessage,hWinMain,ID_RUN,WM_SETTEXT,0,offset szKill;********************************************************************; 执行文件如果成功则等待程序结束;********************************************************************invoke GetStartupInfo,addr stStartUpinvoke CreateProcess,NULL,addr szBuffer,NULL,NULL,\NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo.if eax ! 0invoke WaitForSingleObject,stProcInfo.hProcess,INFINITEinvoke CloseHandle,stProcInfo.hProcessinvoke CloseHandle,stProcInfo.hThread.elseinvoke MessageBox,hWinMain,addr szExcuteError,NULL,MB_OK or MB_ICONERROR.endif;********************************************************************; Enable “退出”按钮并把“中止”按钮改为“执行”;****************************************