函数说明:
CreateProcess是Windows下用于创建进程的API函数,用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
函数原型:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
参数定义:
指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
大多数应用程序都希望生成的应用程序只是使用默认值,最起码要全部初始化为0,再把cb成员设为此结构体的大小,如果没有清0,则新进程可能创建失败.
STARTUPINFO 结构的成员
成员 | 窗口,控制台还是两者兼有 | 作用 |
cb | 两者兼有 | 包含S TA RT U P I N F O 结构中的字节数。如果M i c r o s o f t 将来扩展该结构,它可用作版本控制手段。应用程序必须将c b 初始化为s i z e o f ( S TA RT U P I N F O ) |
lpReserved | 两者兼有 | 保留。必须初始化为N U L L |
lpDesktop | 两者兼有 | 用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果l p D e s k t o p 是N U L L (这是最常见的情况),那么该进程将与当前桌面相关联 |
lpTitle | 控制台 | 用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名 |
dwX dwY |
两者兼有 | 用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。只有当子进程用C W _ U S E D E FA U LT 作为C r e a t e Wi n d o w 的x 参数来创建它的第一个重叠窗口时,才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角 |
dwXSize | 两者兼有 | 用于设定应用程序窗口的宽度和长度(以像素为单位)只有dwYsize 当子进程将C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的n Wi d t h参数来创建它的第一个重叠窗口时,才使用这些值。若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度 |
dwXCountChars dwYCountChars |
控制台 | 用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位) |
dwFillAttribute | 控制台 | 用于设定子应用程序的控制台窗口使用的文本和背景颜色 |
dwFlags | 两者兼有 | 请参见下一段和表4 - 7 的说明 |
wShowWindow | 窗口 | 用于设定如果子应用程序初次调用的S h o w Wi n d o w 将S W _ S H O W D E FA U LT 作为n C m d S h o w 参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是通常用于Show Wi n d o w 函数的任何一个S W _ *标识符 |
cbReserved2 | 两者兼有 | 保留。必须被初始化为0 |
lpReserved2 | 两者兼有 | 保留。必须被初始化为N U L L |
hStdInput hStdOutput hStdError |
控制台 | 用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,h S t d I n p u t 用于标识键盘缓存,h S t d O u t p u t 和h S t d E r r o r用于标识控制台窗口的缓存 |
dwFlags包含一组标志,大多数标志都只是告诉CreateProcess函数,STARTUPINFO 中其他成员是否包含有用的信息,或者是否应该忽略一些成员
使用标志及含义
标志 | 含义 |
STARTF_USESIZE | 使用d w X S i z e 和d w Y S i z e 成员 |
STARTF_USESHOWWINDOW | 使用w S h o w Wi n d o w 成员 |
STARTF_USEPOSITION | 使用d w X 和d w Y 成员 |
STARTF_USECOUNTCHARS | 使用d w X C o u n t C h a r s 和dwYCount Chars 成员 |
STARTF_USEFILLATTRIBUTE | 使用d w F i l l A t t r i b u t e 成员 |
STARTF_USESTDHANDLES | 使用h S t d I n p u t 、h S t d O u t p u t 和h S t d E r r o r 成员 |
STARTF_RUN_FULLSCREEN | 强制在x 8 6 计算机上运行的控制台应用程序以全屏幕方式启动运行 |
另外还有两个标志即STARTF_ORCEONFEEDBACK和STARTFFORCEOFFFEEDBACK,当启动一个新进程时,它们可以用来控制鼠标的光标,由于windows支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时使用另一个程序,为了向用户提供视觉反馈,CreateProcess临时会把系统的光标改成一个新的光标,但
如果指定了STARTF_ORCEONFEEDBACK,CreateProcess就不会改变光标
如果指定了STARTFFORCEOFFFEEDBACK,CreateProcess会改变成新的光标,在2秒之后,如果新进程没有执行任何GUI调用,光标还原,如果执行了GUI调用,则在5秒内必须显示窗口,否则光标同样还原,
PROCESS_INFORMATION结构体:
- typedef struct _PROCESS_INFORMATION {
- HANDLE hProcess;
- HANDLE hThread;
- DWORD dwProcessId;
- DWORD dwThreadId;
- } PROCESS_INFORMATION
运行实例:
注意:lpCommandLine是LPTSTR而不是LPCTSTR,所以这个参数不能是字符串常量,必须是可写的字符串数组。
如果要执行c:\\program files\\internet explorer\\iexplore.exe并传入命令行"http://community.csdn.net/"(用IE打开http://community.csdn.net网址),一般有两种方法。
方法1:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
void RunExe()
{
STARTUPINFO stStartUpInfo;
::memset(&stStartUpInfo, 0 ,sizeof(stStartUpInfo));
stStartUpInfo.cb = sizeof(stStartUpInfo);
PROCESS_INFORMATION stProcessInfo;
::memset(&stProcessInfo, 0 ,sizeof(stProcessInfo));
TCHAR szPath[] = _T("c:\\program files\\internet explorer\\iexplore.exe");
TCHAR szCmd[] = _T(" http://community.csdn.net/"); //lpCommandLine的内容中开头需要一个空格,不然就和lpApplicationName连在一起去了
try
{
bool bRet = ::CreateProcess(
szPath,
szCmd,
NULL,
NULL,
false,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&stStartUpInfo,
&stProcessInfo);
if (bRet)
{
//等待3s后关闭进程
WaitForSingleObject(stProcessInfo.hProcess,3000L);
::CloseHandle(stProcessInfo.hProcess);
::CloseHandle(stProcessInfo.hThread);
stProcessInfo.hProcess = NULL;
stProcessInfo.hThread = NULL;
stProcessInfo.dwProcessId = 0;
stProcessInfo.dwThreadId = 0;
}
else
{
//如果创建进程失败,查看错误码
DWORD dwErrCode = GetLastError();
printf_s("ErrCode : %d\n",dwErrCode);
}
}
catch( ... )
{
}
}
int main(int argc, char* argv[])
{
RunExe();
system("pause");
return 0;
}
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
void RunExe()
{
STARTUPINFO stStartUpInfo;
::memset(&stStartUpInfo, 0 ,sizeof(stStartUpInfo));
stStartUpInfo.cb = sizeof(stStartUpInfo);
PROCESS_INFORMATION stProcessInfo;
::memset(&stProcessInfo, 0 ,sizeof(stProcessInfo));
TCHAR szCmd[] = _T("\"c:\\program files\\internet explorer\\iexplore.exe\" http://community.csdn.net/");
try
{
bool bRet = ::CreateProcess(
NULL,
szCmd,
NULL,
NULL,
false,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&stStartUpInfo,
&stProcessInfo);
if (bRet)
{
//等待3s后关闭进程
WaitForSingleObject(stProcessInfo.hProcess,3000L);
::CloseHandle(stProcessInfo.hProcess);
::CloseHandle(stProcessInfo.hThread);
stProcessInfo.hProcess = NULL;
stProcessInfo.hThread = NULL;
stProcessInfo.dwProcessId = 0;
stProcessInfo.dwThreadId = 0;
}
else
{
//如果创建进程失败,查看错误码
DWORD dwErrCode = GetLastError();
printf_s("ErrCode : %d\n",dwErrCode);
}
}
catch( ... )
{
}
}
int main(int argc, char* argv[])
{
RunExe();
system("pause");
return 0;
}