c++ 启动外部可执行文件

  • Post author:
  • Post category:其他


本文参考:https://blog.csdn.net/Nancy_m/article/details/8643987


.前言


C库中函数

int system(const char* command)

用于执行外部可执行文件,其功能是调用DOS命令,因此需用到cmd命令。其特点为:

1、他不会立即返回,直到你启动的程序执行完成。

2、如果你启动是windows程序,它仍然会启动一个控制台,这就给人感觉太差劲了,但如果本身是控制台的,而且又需要等待它的完成,那这将是比较好的选择。

3、它的返回值代表是否执行成功以及程序的退出码。

4、不能运行*.txt文件或”www.baidu.com”

实际上在vc中,还有很多其他函数代替system(),如:

WinExec(),ShellExecute(),CreateProcess()



使用时需引入:

#include <shlobj.h>   //或替换为 <window.h>
#include <shellapi.h>

注:C++中所表示的路径要用 ” // “而不是平常所用的” / “,所以以上三个函数表示路径都为:disk://Directory//…//File name


.1:WinExec()


函数原型:

UINT WinExec(
  LPCSTR lpCmdLine, // command line 命令行
 UINT uCmdShow     // window style 窗口格式
)

其中第二行是控制程序主窗口的显示方式,参数取值有:

SW_HIDE            //程序启动后隐藏主窗口
SW_MAXIMIZE        //最大化运行
SW_MINIMIZE        //最小化运行
SW_RESTORE         //将最大化或最小化的窗口恢复正常
SW_SHOW            //以当前位置和大小显示主窗口
SW_SHOWMAXIMIZED   //激活窗口并以最大化运行
SW_SHOWMINIMIZED   //激活窗口并以最小化运行
SW_SHOWMINNOACTIVE //最小化运行,但不激活
SW_SHOWNOACTIVATE  //以上一次的窗口大小运行,但不激活
SW_SHOWNORMAL      //普通方式,一般运行时采用这个

例:

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    //打开qq
	WinExec("D://Bin//QQScLauncher.exe", SW_SHOWMINIMIZED);
}

优点:

1、它将启动了一个新进程,并且立即返回,因此你的程序无需等待。

2、它的多了一个参数:uCmdShow,通过它你可以一定程度上控件窗体的显示,比如让它后台运行而不显示出来。

3、它无论启动控制台程序还是windows程序都只做你想要做的事。

缺点:

1、它完全与本进程脱离,无法对做些必要的控制。

2、无法得知启动的程序是否退出。

3、得不到启动的程序的退出码。

4、不能运行*.txt文件或”www.baidu.com”,可理解成专门执行exe文件

注:实际上无法通过第二参数改变主窗口,根据https://blog.csdn.net/wbq2018/article/details/8759031,似乎只能影响16位的系统。


.2:ShellExecute()


函数原型:

HINSTANCE ShellExecute( 
   HWND hwnd,            //父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL。
   LPCTSTR lpVerb,       //操作。
   LPCTSTR lpFile,       //要打开的文件名、执行的程序名、浏览的文件夹等。
   LPCTSTR lpParameters, //可执行程序的参数,否则为 NULL。
   LPCTSTR lpDirectory,  //默认目录。
   INT nShowCmd          //显示类型。
); 

其中:

lpVerb是一个字符串,通常为:

 1. edit 用编辑器打开 lpFile 指定的文档,如果 lpFile 不是文档,则会失败
 2. explore 浏览 lpFile 指定的文件夹
 3. find 搜索 lpDirectory 指定的目录
 4. open 打开 lpFile 文件,lpFile 可以是文件或文件夹
 5. print 打印 lpFile,如果 lpFile 不是文档,则函数失败
 6. properties 显示属性
 7. runas 请求以管理员权限运行,比如以管理员权限运行某个exe
 8. NULL 执行默认”open”动作

nShowCmd 执行操作之后程序显示类型,指定该参数后运行起来的程序不一定能按照指定参数显示,只是通知程序的显示状态。类型如下:

SW_HIDE            隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE        最小化窗口,活动状态给令一个窗口
SW_RESTORE         用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW            用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED   最大化窗口,并将其激活
SW_SHOWMINIMIZED   最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA          用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE  用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL      与SW_RESTORE相同

返回值:

返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。错误如下:

0 系统内存或资源不足
ERROR_FILE_NOT_FOUND   找不到指定的文件
ERROR_PATH_NOT_FOUND   找不到指定路径
ERROR_BAD_FORMAT       .exe文件无效
SE_ERR_ACCESSDENIED    拒绝访问指定文件
SE_ERR_ASSOCINCOMPLETE 文件名关联无效或不完整
SE_ERR_DDEBUSY         DDE事务正在处理,DDE事务无法完成
SE_ERR_DDEFAIL         DDE事务失败
SE_ERR_DDETIMEOUT      请求超时,无法完成DDE事务请求
SE_ERR_DLLNOTFOUND     未找到指定dll
SE_ERR_FNF             未找到指定文件
SE_ERR_NOASSOC         未找到与给的文件拓展名关联的应用程序,比如打印不可打印的文件等
SE_ERR_OOM             内存不足,无法完成操作
SE_ERR_PNF             未找到指定路径
SE_ERR_SHARE           发生共享冲突

优点:可执行”.txt”文件和打开网页

例:

打开docx

ShellExecute(NULL, L"open", L"D://1100//file_test//test_with_ShellExecute.docx", NULL, NULL, SW_HIDE);

打开网页

//其中第三个参数是浏览器执行文件,并在第四参数上输入你想要输入的网址
//这里使用的是edge
ShellExecute(NULL, L"open", L"msedge",L" https://www.bilibili.com/",  NULL, SW_SHOWMAXIMIZED);

.3:CreateProcess()

实际上这是WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

函数原型:

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 //新的进程返回的信息
);

注:这个函数功能很强大,这里只讲怎么打开可执行文件,以后找机会再详细写写。

例:

#include <iostream>
#include <algorithm>
#include <windows.h>
#include <shellapi.h>
#include <tchar.h>

using namespace std;

int main()
{
	STARTUPINFO si;//必备参数设置
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_SHOW;
	PROCESS_INFORMATION pi;//必备参数设置结束

    //关于CreateProcess的版本问题,建议参考https://blog.csdn.net/dyzhen/article/details/6424273
	TCHAR tc[] = TEXT("D:\\Bin\\QQScLauncher.exe");
	bool res = CreateProcessA(NULL, tc, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}



版权声明:本文为qq_43530773原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。