windows核心编程 第四章 进程
获得当前目录:
DWORD GetFullPathName(PCTSTR pszFile,DWORD cchPath,PTSTR pszPath,PTSTR *ppszFilePart);
获取C盘的当前目录
TCHAR szCurDir[MAX_PATH];
GetFullPathName("C",MAX_PATH,szCurDir,NULL);
获得系统版本:
BOOL GetVersion(POSVERSIONINFO pVersionInformation);
创建进程函数:
BOOL CreateProcess
{
PCTSTR pszApplicationName;//新进程使用的可执行文件的名字
PTSTR pszCommandLine;//传递给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess;//创建进程的安全属性,一般默认为NULL
PSECURITY_ATTRIBUTES psaThread; //创建线程的安全属性,一般默认为NULL
BOOL bInteritHandle;//是否可继承
DWORD fdwCreate;//如何来创建进程
PVOID pvEnvironment;//用于指向包含新进程将要使用的环境字符串的内存块
PCTSTR pszCurDir;//父进程设置目录,NULL为默认程序运行的目录
PSTARTUPINFO psiStartInfo;//指向STARTUPINFO结构,堆栈,最好要先
STARTUPINFO si={sizeof(si)};
GetStartupInfo(&si);(初始化)否则会把无用信息传递给CreateProcess,产生不确定因素
PPROCESS_INFOMATION ppiProcInfo//PROCESS_INFORMATION结构,里面记录该进程的所拥有的线程ID和子进程ID
};
成功返回TRUE //注意,如果创建进程找不到相关的DLL也会返回TRUE;
pszCommandLine最好不要传入常量,VC会把传入的字符串放入只读内存,例如:
CreateProcess(NULL,_T("NOTEPAD"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
将会运行错误(经过自己测试,GCC不会运行错误,VS2005会,书上说早期的VC也不会错误)
最好是:
TCHAR szCommandLine[]=_T("NOTEPAD");
CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
将会打开NOTEPAD程序
TCHAR szPath[]="WORDPAD README.TXT";
CreateProcess("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE",szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
打开NOTEPAD程序,并传入szpaht的命令
fdwCreate 用于规定如何来创建新进程,也可以设定优先级.
EBUG_PROCESS:当子进程发生某些事情,要告诉父进程
DEBUG_ONLY_THIS_PROCESS:和EBUG_PROCESS类似,不过只告诉发生的某些特定时间,比如子进程再创建子进程就不告诉
CREATE_SUSPENDED:子进程创建,父进程挂起
DETACHED_PROCESS:组织基于GUI进程对他的父进程console的访问,并将输出发送到新的console窗口
CREATE_NEW_CONSOLE:创建新进程同时为新进程创建控制台,不可和DETA_PROCESS同时使用,否则产生一个错误
CREATE_NO_WINDOW:不要为新进程创建控制台窗口
CREATE_NEW_PROCESS_GROUP:当创建多个进程后,如果用户按下CTRL+C,那么将会同时告诉所有进程用户按下CTRL+C;
CREATE_DEFAULT_ERROR_MODE:新进程不继承父进程的错误使用模式
CREATE_SEPARATE_WOW_VDM:当在WINDOWS 2000运行16位的时候,创建单独的DOS虚拟机
CREATE_SHARED_WOW_VDM:当在windows 2000运行16位的时候,除非设定CREATE_SHPARATE_WOW_VDM,否则所有16位程序都在单独的DOS虚拟机运行,但是可以改变注册表共享
CREATE_FORCEDOS:强制系统运行嵌入16位OS/2应用程序的MOS-DOS应用程序
CREATE_BREAKAWAY_FROM_JOB:使用作业中的金衡生成一个与作业相关联的新进程
终止运行进程:
1.主线程函数返回(最好的方法)
2.进程中的线程调用ExitProcess(最好不要);
3.另外一个进程中的线程(最好也不要);
4.所有线程自行终止
BOOL TerminateProcess(HANDLE hProcess,UINT fuExitCode);
与EixtProcess差别:任何线程都可以调用TerminateProcess
获得目前已经撤销进程的退出代码
BOOL GetExitCodeProcess(HANDLE hProcess,PDWORD pdwExitCode);
CloseHandle(HANDLE hProcess);关闭不用的句柄,很重要
DWORD WaitForSingleObject(HANDLE hObject,DWORD dwTimeout);
等待hObject终止运行
PVOID GetModulePreferredBaseAddr(DWORD dwProcessID,PVOID pvModuleRemote);
接受一个进程ID和进程模块的地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述