• 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和进程模块的地址

  • 相关阅读:
    CF140CNew Year Snowmen
    ZR10.1青岛集训三地联考
    CF1228——记一次和紫名失之交臂的CF
    CF1220
    codeforce 382 div2 E —— 树状dp
    codeforce 381 div2
    codeforce 380(div.2)
    Bishops Alliance—— 最大上升子序列
    codeforce 379(div.2)
    模板——BigInteger
  • 原文地址:https://www.cnblogs.com/linyilong3/p/1853215.html
Copyright © 2020-2023  润新知