[转]Windows多进程编程

转自:https://blog.csdn.net/bxhj3014/article/details/2082255缓存

1、进程的概念安全

  进程是是一个正在运行的程序的实例,是系统分配资源的单位(线程是执行的单位),包括内存,打开的文件、处理机、外设等,进程由两部分组成:数据结构

  1. 进程的内核对象:即咱们一般所讲的PCB(进程控制块),该结构只能由该内核访问,他是操做系统用来管理进程的一个数据结构,操做系统经过该数据结构来感知和管理进程;它的成员负责维护进程的各类信息,包括进程的状态(建立、就绪、运行、睡眠、挂起、僵死等)、消息队列等;同时也是系统用来存放关于进程的统计信息的地方。多线程

  2. 进程的地址空间:包含全部可执行模块或DLL模块的代码和数据,以及动态内存分配的空间,如线程堆栈和堆分配的空间。共有4G,0-2G为用户区,2-4G为系统区。架构

2、进程的建立过程
      一、系统建立进程内核对象(PCB进程控制块)。
      二、系统为新进程建立虚拟地址空间,帮将可执行文件或任何须要的DLL文件的代码和数据加载到该进程的地址空间。
      三、系统为新进程的主线程建立一个线程内核对象(TCB线程控制块)。
      四、经过执行C/C++运行期启动代码,该主线程开始运行。
函数


      注:在Windows环境下,尽可能用多线程而不是多进程。
spa

3、与进程相关的API操作系统

  一、建立进程
            BOOL CreateProcess(
                    PCTSTR      psApplicationName,  //可执行文件的名字
                    PTSTR      pszCommandLine,      //命令行字符串
                    PSECURITY_ATTRIBUTES psaProcess,   //进程对象的安全性
                    PSECURITY_ATTRIBUTES psaThread,   //线程对象的安全性
                    BOOL      bInheritHandles, //句柄可继承性
                    DWORD      fdwCreate,      //标识符(优先级)
                    PVOID      pvEnvironment, //指向环境字符串
                    PCTSTR      pszCurDir,   //子进程当前目录
                    PSTARTUPINFO    psiStartInfo,
                    PPROCESS_INFORMATION ppiProcInfo);   //进程线程句柄及ID
.net

  二、打开进程 (获取hProcessId对应的进程的内核对象句柄)
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //访问安全属性
                    BOOL bInheritHandle,  //继承属性
                    DWORD hProcessId);   //进程ID
命令行

  三、终止进程
    (1)主线程的进入点函数返回
    (2)进程本身终止本身
                VOID ExitProcess(
                          UINT fuExitCode); //退出代码
    (3)终止自身进程或其余进程
                BOOL TerminateProcess(
                        HANDLE hProcess, //进程句柄
                        UINT fuExitCode); //退出代码

  四、获取进程的可执行文件或DLL对应的句柄
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模块名称
              注:当参数传NULL时获取的是进程的地址空间中可执行文件的基地址。

  五、找出某个指定窗口的建立者(线程或进程),返回建立者的ID。哪一个线程建立了这个窗口,返回的就是这个线程的id号 (进程只有一个线程的话,那么线程标志符与进程标志符就是指同一个标志符)。
              HANDLE GetWindowThreadProcessId(
                      HWND hWnd,    //窗口句柄
                      LPDWORD lpdwProcessId); //指向建立该窗口的进程或线程的ID

  六、获取进程的运行时间
              Bool GetProcessTimes(
                      HANDLE hProcess,   //进程句柄
                      PFILETIME pftCreationTime, //建立时间
                      PFILETIME pftExitTime, //退出时间
                      PFILETIME pftKernelTime, //内核时间
                      PFILETIME pftUserTime); //用户时间
              注:返回的时间适用于某个进程中的全部线程(甚至已经终止运行的线程)。

  七、获取当前进程的一个伪句柄
              HANDLE GetCurrentProcess();
               注:该函数获取当前进程的伪句柄,一般状况值为-1,只能标识当前进程内核对象, 能够复制,但不可继承。没必要调用CloseHandle()函数来关闭这个句柄。
                    伪句柄只能用于进程内部,若是你想获得实际得句柄,在进程间进行通信,必须要进行转化,调用DuplicateHandle,注意,得实句柄使用完成之后,你必需要调用CloseHandle去关闭.

  八、将进程的伪句柄转换为实句柄
              HANDLE DuplicateHandle(
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        &hProcess,
                        0,
                        FALSE ,
                        DUPLICATE_SAME_ACCESS); 

    注:实例句柄必需要调用CloseHandle()函数来关闭这个句柄,不然有句柄泄露。

  九、获取当前进程ID
              DWORD GetCurrentProcessId();
  十、获取进程优先级
              DWORD GetPriorityClass(HANDLE hProcess);

   十一、修改进程的优先级类
                  BOOL SetPriorityClass(
                       HANDLE hProcess, //进程句柄
                       DWORD fdwPriority); //相对进程优先级
              注1:相对线程优先级
                     实时:        REALTIME_PRIORITY_CLASS
                     高:            HIGH_PRIORITY_CLASS
                     高于正常;    ABOVE_NORMAL_PRIORITY_CLASS
                     正常:        NORMAL_PRIORITY_CLASS
                     低于正常: BELOW_NORMAL_PRIORITY_CLASS
                     空闲:        IDLE_PRIORITY_CLASS
              注2:只要拥有进程的句柄和足够的权限,就可以修改系统中运行的任何进程的优 先级类。

   十二、获取指定进程已经打开的句柄的数量
              BOOL GetProcessHandleCount(
                        HANDLE hProcess,   //句柄
                        PDWORD pdwHandleCount); //句柄计数

  1三、获取环境变量
              DWORD GetEnvironmentVariable(
                        LPCTSTR lpName, //环境变量的名字
                        LPTSTR lpValue, //存放返回字符串的缓冲区
                        DWORD cchValue); //缓冲区的大小
              注:返回值为返回字符串的长度,当缓存不足时返回所需字符串的长度。经常使用的系统环境变量以下:

 1 WINDIR:                 //系统目录 - C:\WINDOWS 
 2 SYSTEMROOT:             //系统目录 - C:\WINDOWS 
 3 SYSTEMDRIVE:            //系统根目录 - C: 
 4 HOMEDRIVE:              //当前用户根目录 - C: 
 5 USERPROFILE:            //当前用户目录 - C:\Users\Kandy 
 6 HOMEPATH:               //当前用户路径 - \Users\Kandy 
 7 TMP:                    //当前用户临时文件夹 - C:\Users\Kandy\AppData\Local\Temp 
 8 TEMP:                   //当前用户临时文件夹 - C:\Users\Kandy\AppData\Local\Temp 
 9 APPDATA:                //当前用户数据文件夹 - C:\Users\Kandy\AppData\Roaming 
10 PROGRAMFILES:           //程序默认安装目录 - C:\Program Files (x86) 
11 COMMONPROGRAMFILES:     //文件通用目录 - C:\Program Files (x86)\Common Files 
12 USERNAME:               //当前用户名 - Kandy 
13 ALLUSERSPROFILE:        //全部用户文件目录 - C:\ProgramData 
14 OS:                     //操做系统名 - Windows_NT 
15 COMPUTERNAME:           //计算机名 - KANDY-PC 
16 NUMBER_OF_PROCESSORS:   //处理器个数 - 4 
17 PROCESSOR_ARCHITECTURE: //处理器芯片架构 - x86 
18 PROCESSOR_LEVEL:        //处理器型号 - 6 
19 PROCESSOR_REVISION:     //处理器修订号 - 3c03 
20 USERDOMAIN:             //包含用户账号的域 - KANDY-PC 
21 COMSPEC:                //C:\WINDOWS\system32\cmd.exe 
22 PATHEXT:                //执行文件类型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 
23 PATH:                   //搜索路径 

 

  1四、设置环境变量
              DWORD SetEnvironmentVariable(
                        LPCTSTR lpName, //环境变量的名字
                        LPCTSTR lpValue); //存放变量值字符串的缓冲区
              注:当环境变量lpName不存在,且lpValue不为空时,将建立一个新的环境变量。

相关文章
相关标签/搜索