创建进程的4个函数:
1.WinExec
UINT WINAPI WinExec(
_In_ LPCSTR lpCmdLine,//命令行参数,也可以是可执行文件(exe)路径
_In_ UINT uCmdShow
);
例子:
//打开计算器
WinExec("calc", SW_SHOW);
//打开其它程序
WinExec("F:\\MFC-TEST.exe", SW_SHOW);
2.ShellExecute
SHSTDAPI_(HINSTANCE) ShellExecute(
__in_opt HWND hwnd, //父窗口局句柄
__in_opt LPCTSTR lpOperation, //操作指令(open、print、edit、explore、find等)
__in LPCTSTR lpFile, //指定要打开的文件或者程序,必须存在
__in_opt LPCTSTR lpParameters,//给要打开的程序指定参数,如果是文件则为null
__in_opt LPCTSTR lpDirectory, //文件(程序)目录
__in INT nShowCmd); //打开选项
例子:
ShellExecute(nullptr, TEXT("open"), TEXT("test.txt"), nullptr, TEXT("F:\\"), SW_SHOW);
3.ShellExecuteEx
SHELLEXECUTEINFO
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize; //存储该结构的长度,以字节为单位
ULONG fMask; //一个标志数组,用来设置其他成员的有效性
HWND hwnd; //调用这个ShellExecuteEx的窗口句柄
LPCTSTR lpVerb; //设定这个ShellExecuteEx的动作
LPCTSTR lpFile; //文件名
LPCTSTR lpParameters;//运行/打开程序的参数,如果打开的是一个文档,则该项无效
LPCTSTR lpDirectory; //指明工作目录的名字,成员没有说明,则默认为当前目录
int nShow; //说明ShellExecuteEx打开的程序将以什么形式出现
HINSTANCE hInstApp; //如果函数运行成功,该项的值将大于32
LPVOID lpIDList; //一个itemidlist结构的地址,用来存储成员的特别标识符,当fMask不包括see_mask_idlist或see_mask_invokeidlist时该项被忽略
LPCTSTR lpClass; //用以指明文件类别的名字或GUID,当fMask不包括see_mask_classname时该项被忽略
HKEY hkeyClass; //获得已在系统注册的文件类型的Handle,当fMask不包括see_mask_classkey时该项被忽略
DWORD dwHotKey; //程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),修改标志为(modifier flags)的详细列表请看wm_sethotkey消息的描述,当fmask不包括see_mask_hotkey时该项被忽略
union {
HANDLE hIcon; //取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略
HANDLE hMonitor; //将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略
} DUMMYUNIONNAME;
HANDLE hProcess; //用于进行return操作的成员,若fMask不设为see_mask_nocloseprocess则该项值为null,即使fMask设为see_mask_nocloseprocess,若没有进程启动,该项值仍为null。即没有新的进程启动,则该项值一只为null 。
} SHELLEXECUTEINFO, FAR* LPSHELLEXECUTEINFO;
/* 设定这个ShellExecuteEx的动作,包括: edit 打开编辑器编辑文档,如果 lpFile 不是一个文档,则这个函数会失败 explore 以 lpFile 为路径打开资源管理器 find 从指定目录开始搜索 open 根据 lpFile 打开对应文件,该文件可以为可执行文件、文档或者文件夹 print 根据 lpFile 打印文档,若lpFile不是一个文档则该函数会失败 properties 显示文件或文件夹的属性 */
/* 如果函数运行成功,该项的值将大于32,否则会是下列错误对应的值 SE_ERR_FNF 没有找到文件 SE_ERR_PNF 没有找到路径 SE_ERR_ACCESSDENIED 拒绝访问 SE_ERR_OOM 内存不足 SE_ERR_DLLNOTFOUND 没有找到动态链接库 SE_ERR_SHARE 不能操作一个以打开的文件 SE_ERR_ASSOCINCOMPLETE 文件关联信息不完整 SE_ERR_DDETIMEOUT DDE操作超时 SE_ERR_DDEFAIL DDE操作失败 SE_ERR_DDEBUSY DDE繁忙 SE_ERR_NOASSOC 没有找到文件关联 */
例子:
//信息结构
SHELLEXECUTEINFO exeInfo = { 0 };
exeInfo.cbSize = sizeof(SHELLEXECUTEINFO);//设置大小
exeInfo.lpVerb = TEXT("open");//打开操作
exeInfo.lpFile = TEXT("test.txt");//文件名
exeInfo.lpDirectory = TEXT("F:\\");//文件目录
exeInfo.lpParameters = nullptr; //文本文件不需要参数
exeInfo.fMask = SEE_MASK_NOCLOSEPROCESS;//标志
exeInfo.nShow = SW_SHOWDEFAULT;//用默认的方式显示出来
ShellExecuteEx(&exeInfo);
4.CreateProcess
BOOLCreateProcess
(
LPCTSTR lpApplicationName,//应用程序名称,不能打开其它类型文件
LPTSTR lpCommandLine, //命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes。//进程安全性
LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程安全性
BOOL bInheritHandles,//是否允许子进程继承
DWORD dwCreationFlags,//创建进程标志
LPVOID lpEnvironment,//环境变量
LPCTSTR lpCurrentDirectory,//驱动器和目录
LPSTARTUPINFO lpStartupInfo,//启动信息结构
LPPROCESS_INFORMATION lpProcessInformation//进程信息结构
);
例子:;
//进程信息结构
PROCESS_INFORMATION pi = { 0 };
//启动信息结构
STARTUPINFO si = { 0 };
si.cb = sizeof(si);
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;//启动标志,显示窗口
::CreateProcess(
TEXT("C:\\windows\\system32\\calc.exe"),//可执行文件(exe)或模块路径
nullptr,//命令行参数
nullptr,//默认进程安全性
nullptr,//默认线程安全性
FALSE, //指定当前进程内局部不可以被子进程继承
0, //创建进程的标志,这里设为0,不需要
nullptr,//使用本进程的环境变量
nullptr,//使用本进程的驱动器和目录
&si,&pi);
命令行参数只能是const char类型,所以最好用c语言写.