#include <stdio.h>
#include <windows.h>
//使用多字符集
#if 0
笔记:
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
);
备注:
//CreateProcess的第3、4个参数为结构体,控制子进程,是否能继承主进程句柄表中存储的,其它子进程的进程句柄或线程句柄
//创建进程时,会产生一个进程内核对象和线程的内核对象,进程和线程也是内核对象
//例如,主进程A创建了1、2子进程, 1、2的进程句柄和线程句柄,就存储在主进程A的内核对象句柄表中
关于句柄和ID
1、都是系统分配的一个编号,句柄是客户程序使用 ID主要是系统调度时使用.
2、调用CloseHandle关闭进程或者线程句柄的时候,只是让内核计数器减少一个,并不是终止进程或者线程.
进程或线程将继续运行,直到它自己终止运行。
3、进程ID与线程ID 是不可能相同。但不要通过进程或者线程的ID来操作进程或者线程,因为,这个编号是会
重复使用的,也就是说,当你通过ID = 100这个编号去访问一个进程的时候,它已经结束了,而且系统将这个编号
赋给了另外一个进程或者线程.
#endif
VOID TestCreateProcessByAPPName()
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);//一般情况,只要为第一个成员赋值就可以了,指定结构体大小
TCHAR szApplicationName[] = TEXT("c://program files//internet explorer//iexplore.exe");
BOOL res = CreateProcess(
szApplicationName,
NULL,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL, &si, &pi);
}
VOID TestCreateProcessByCmdline()
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
TCHAR szCmdline[] = TEXT("c://program files//internet explorer//iexplore.exe http://www.ifeng.com");
BOOL res = CreateProcess(
NULL,
szCmdline,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL, &si, &pi);
}
VOID TestCreateProcess()
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
TCHAR szCmdline[] = TEXT(" http://www.ifeng.com");
BOOL res = CreateProcess(
TEXT("c://program files//internet explorer//iexplore.exe"),//可以是常量
szCmdline, //但命令行常用于传递一些参数,例如打开子进程时,传递句柄过去
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL, &si, &pi);
}