在MFC中打开其他可执行文件常用到的方法有:WinExec、ShellExecute、CreatProcess。
WinExec 主要运行EXE文件,用法简单,只有两个参数,前一个指定命令路径,后一个指定窗口显示方式:
UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow)
示例:WinExec("E:\\Program Files\\AppStore\\appstore.exe", SW_SHOW);
ShellExecute比WinExec灵活一些,可以指定工作目录。不仅可以运行EXE文件,还可以运行已经关联的文件。
HINSTANCE ShellExecute(
__in_opt HWND hwnd, //父窗口句柄
__in_opt LPCTSTR lpOperation, //操作方式
__in LPCTSTR lpFile, // 文件名称
__in_opt LPCTSTR lpParameters, //参数
__in_opt LPCTSTR lpDirectory, //默认工作路径,必须为绝对路径
__in INT nShowCmd //显示方式
);
示例:
ShellExecute(NULL,"open","appstore.exe",NULL,"E:\\Program Files\\Appstore",SW_SHOW);
之前曾碰到一个问题,对于同一个可执行文件用第一种WinExec方法打开文件里面内容无法显示,而用后面这种ShellExecute方法则能正确显示,原因是后面一种方法指定了程序当前工作路径。
CreateProcess是最复杂的方法,一共有十个参数,不过大部分都可以用NULL来答题,他可以指定进程的安全属性,继承属性,累的优先级等等,如果我们要得到足够多的关于新的进程信息,控制新的进程细节属性,就需要使用CreateProcess函数了。
BOOL CreateProcess(
LPCTSTR lpApplicationName, //执行程序名
LPTSTR lpCommandLine, // 参数行
//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
LPSECURITY_ATTRIBUTES lpProcessAttributes, //process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // 继承标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
);
示例:CreateProcess(NULL,"E:\\liucheng.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
ps:
1.C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:Disk:\\Directory\\...\\File name
2.ShowCmd 显示方式:
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同