作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 优快云博客日期:2012年11月4日
1. 进程main函数
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);
- hInstance每个.exe .dll都被赋予了unique的instance handle,在需要加载资源的API中需要提供此Handle。
- hPrevInstance进程前一个实例的句柄,16位机器使用。
-
lpCmdLine
int nNumArgs; PWSTR *ppArgv = CommandLineToArgvW(GetCommandLineW(), &nNumArgs); -
进程环境变量
PTSTR pEnvBlock = GetEnvironmentStringsW(); FreeEnvironmentStringsW(pEnvBlock); SetEnvironmentStringsW(LPWCH NewEnvironment); ExpandEnvironmentStringsW(LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize); -
进程当前所在Drive和Dir
DWORD WINAPI GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer); HRESULT SetCurrentDirectory(LPCOLESTR pszDir); DWORD GetFullPathName(...); -
子进程 为了防止一个方法破坏现有堆栈,可以创建子进程,并同步等待子进程终止。
PROCESS_INFORMATION pi; DWORD dwExitCode; BOOL bSuccess = CreateProcess(..., &pi); if (bSuccess) { CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &dwExitCode); CloseHandle(pi.hProcess); } -
枚举进程性能 WindowsNT开发的PSAPI.dll中提供了一组API。
2. CreateProcess函数
BOOL WINAPI CreateProcess(
__in LPCTSTR lpApplicationName,
__in_out LPTSTR lpCommandLine,
__in LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in LPVOID lpEnvironment,
__in LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
- 名字、命令行
LPCTSTR与LPTSTR的区别。* lpProcessAttributes、lpThreadAttributes、bInheritHandles指定安全性,NULL或者SECURITY_ATTRIBUTES;bInheritHandles之前讨论过。dwCreationFlags用于调试子进程lpEnvironment新进程的环境变量lpCurrentDirectory当前Drive/Dir
3. 终止进程
- 主线程入口点函数返回(Strong Recommanded)
ExitProcess/ExitThread函数 会导致C/C++ 运行时库不能完成清理工作TerminateProcess函数 异步函数,使用WaitForSingleObject确保完成
4. Job
经常需要将一组进程当做单个实体处理,例如使用VS Build C++ Project时会生成若干Cl.exe。用户希望提前停止Build,VS必须能终止Cl.exe及所有子进程。
-
创建Job
HANDLE WINAPI CreateJobObject(LPSECURITY_ATTRIBUTES lpJobAttributes, LPCTSTR lpName); -
将Process放入Job中
BOOL WINAPI AssignProcessToJobObject(HANDLE hJob, HANDLE hProcess); -
对Job中的Process施加Restriction
BOOL WINAPI SetInformationJobObject(HANDLE hJob, JOBOBJECTINFOCLASS JobObjectInfoClass, LPVOID lpJobObjectInfo, DWORD cbJobObjectInfoLength); -
终止Job中所有Process
BOOL WINAPI TerminateJobObject(HANDLE hJob, UINT uExitCode);
本文详细介绍Windows环境下进程管理的关键技术,包括进程的启动、环境配置、目录操作、子进程创建及同步等待、进程性能枚举等核心概念。同时,深入探讨了如何通过Job对象统一管理和控制多个进程。
2062

被折叠的 条评论
为什么被折叠?



