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”。
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; 赋值
这个传出的结构体就比较重要了
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; //进程句柄 HANDLE hThread; //线程句柄 DWORD dwProcessId; //线程 DWORD dwThreadId; //进程id } PROCESS_INFORMATION;
微软定义的lpApplicationName和lpCommandLine最后会拼接成一个字符串
如果不加空格会出现这样的情况,这样路径和命令行参数就出错了
E:\CC++project111 222 333
所以我们不使用第一个参数,直接自己把全路径和命令行参数全部放在第二个参数。
GetCommandLine获取命令行,main(arg,arv)就是使用这个api获得的。
3) 退出进程
Exitprocess(0)//只能退出当前进程 TerminateProcess//关闭任意进程 BOOL TerminateProcess( HANDLE hProcess, // handle to the process UINT uExitCode // exit code for the process );
4) 其他
WriteProcessMemory
ReadProcessMemory
修改进程的内存数据
草堂教程网 » Windows系统3种创建进程的方法