Windows系统3种创建进程的方法

1. 三种创建进程的方法

1) Winexec

Msdn文章介绍

Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.

翻译:

WinExec是一种函数,该函数只提供对16位机子的兼容。应用程序应该使用CreateProcess函数。

UINT WinExec(

LPCSTR lpCmdLine, // command line

UINT uCmdShow // window style

);

1) ShellExecute

ShellExecute(

 HWND hwnd, 父窗口句柄 (如:NULL,Handle等)

  LPCSTR lpOperation, //操作类型 (如:"open"*要加英文双引号

  LPCSTR lpFile, //要进行操作的文件或路径,还可以加命令行参数,下面参数也可以

 LPCSTR lpParameters, //当lpOperation为“explore”时指定要传递的参数,通常设为 NULL

  LPCSTR lpDirectory, //"宋体">指定默认目录,通常设为NULL

  INT nShowCmd //文件打开的方式,以通常方式还是最大化或最小化显示,一般为SW_SHOWNORMAL

注意:

●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行

默认操作“open”

image.png

2) CreateProcess

BOOL CreateProcess(

  LPCTSTR lpApplicationName, // name of executable module 文件名,如果后面没有设置当前

目录需要写全路径

  LPTSTR lpCommandLine,                      // command line string  命令行参数

  LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD  进程安全属性,是否被继承

  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD  线程安全属性

  BOOL bInheritHandles,   // handle inheritance option 是否继承父线程属性

  DWORD dwCreationFlags, // creation flags  创建标志

  LPVOID lpEnvironment,     // new environment block 环境变量,为空则为默认的

  LPCTSTR lpCurrentDirectory, // current directory name 指向当前目录名的指针 为空则为运行目录

  LPSTARTUPINFO lpStartupInfo,  // startup information 传递给新进程的信息  

  LPPROCESS_INFORMATION lpProcessInformation // process information 新进程返回的信息

);

其中 LPSTARTUPINFO和LPPROCESS_INFORMATION

为两个重要的结构体

typedef struct _STARTUPINFO {

    DWORD   cb; //<font face="宋体">结构体大小</font>

    LPTSTR  lpReserved;

    LPTSTR  lpDesktop;

    LPTSTR  lpTitle;

    DWORD   dwX;

    DWORD   dwY;

    DWORD   dwXSize;

    DWORD   dwYSize;

    DWORD   dwXCountChars;

    DWORD   dwYCountChars;

    DWORD   dwFillAttribute;

    DWORD   dwFlags;

    WORD    wShowWindow; //<font face="宋体">显示方式</font>

    WORD    cbReserved2;

    LPBYTE  lpReserved2;

    HANDLE  hStdInput;

    HANDLE  hStdOutput;

    HANDLE  hStdError;

} STARTUPINFO, *LPSTARTUPINFO;

可以使用_GetStartupInfo__直接填写信息,也可以自己写,主要就是_DWORD cb;WORD wShowWindow; 赋值

image.png

这个传出的结构体就比较重要了

typedef struct _PROCESS_INFORMATION {

    HANDLE hProcess; //进程句柄

    HANDLE hThread; //线程句柄

    DWORD dwProcessId; //线程

    DWORD dwThreadId; //进程id

} PROCESS_INFORMATION;

微软定义的lpApplicationName和lpCommandLine最后会拼接成一个字符串

如果不加空格会出现这样的情况,这样路径和命令行参数就出错了

E:\CC++project111 222 333

所以我们不使用第一个参数,直接自己把全路径和命令行参数全部放在第二个参数。

GetCommandLine获取命令行,mainargarv)就是使用这个api获得的。

3) 退出进程

Exitprocess(0)//只能退出当前进程
TerminateProcess//关闭任意进程
BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);

4) 其他

image.png

WriteProcessMemory

ReadProcessMemory

修改进程的内存数据

转载请说明出处
草堂教程网 » Windows系统3种创建进程的方法

发表评论

欢迎 访客 发表评论

一个纯粹的精品教程收录分享站点

查看演示 官网购买