MFC-创建进程

创建进程的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语言写.

你可能感兴趣的:(MFC)