创建进程函数:
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1 。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L 文件的代码和数据加载到该进程的地址空间中。
然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1 )。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执行C / C + +运行期启动代码,该主线程便开始运行,它最终调用Wi n M a i n 、w Wi n M a i n 、m a i n 或w m a i n 函数。如果系统成功地创建了新进程和主线程,C r e a t e P r o c e s s 便返回T R U E 。
创建子进程实例:
void test2()
{
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口
TCHAR cmdline[] =TEXT("c://program files//internet explorer//iexplore.exe http://blog.youkuaiyun.com/sunboyiris");
BOOL bRet = ::CreateProcess (
NULL,
cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
int error = GetLastError();
if(bRet)
{
::CloseHandle (pi.hThread);
::CloseHandle (pi.hProcess);
printf(" 新进程的进程ID号:%d /n", pi.dwProcessId);
printf(" 新进程的主线程ID号:%d /n", pi.dwThreadId);
}
else
{
printf("error code:%d/n",error );
}
}
PROCESS_INFORMATION pi;
DWORD dwExitCode;
//Spawn the child process
BOOL fSuccess = CreateProcess(... , &pi);
if(fSuccess){
/*close the thread handle as soon as it is no longer needed!*/
CloseHandle(pi.hThread);
/*Suspend our execution until the child has terminate.*/
WaitForSingleObject(pi.hProcess,INFINITE);
/*The child process terminate;get its exit code.*/
GetExitCodeProcess(pi.hProcess,&dwExitCode);
/*Close the process handle as soon as it is no longer needed.*/
CloseHandle(pi.hProcess);
}
创建子进程也可参照以上模式。