windows下启动外部应用程序

1.ShellExecute

SHSTDAPI_(HINSTANCE) ShellExecuteA(__in_opt HWND hwnd, __in_opt LPCSTR lpOperation, __in LPCSTR lpFile, __in_opt LPCSTR lpParameters,
    __in_opt LPCSTR lpDirectory, __in INT nShowCmd);
SHSTDAPI_(HINSTANCE) ShellExecuteW(__in_opt HWND hwnd, __in_opt LPCWSTR lpOperation, __in LPCWSTR lpFile, __in_opt LPCWSTR lpParameters,
    __in_opt LPCWSTR lpDirectory, __in INT nShowCmd);
#ifdef UNICODE
#define ShellExecute  ShellExecuteW
#else
#define ShellExecute  ShellExecuteA
#endif // !UNICODE



HINSTANCE ShellExecute( 
	HWND hwnd, 
	LPCTSTR lpOperation,
	LPCTSTR lpFile, 
	LPCTSTR lpParameters, 
	LPCTSTR lpDirectory, 
	INT nShowCmd
);

hWnd:用于指定父窗口的句柄。当函数调用过程中出现错误时,它将作为Windows消息窗口的父窗口。
lpOperation:用于指定要进行的操作, 如: open、runas、print、edit、explore、find。当此参数为NULL时,默认执行open操作。(open:表示执行由lpFile参数指定的程序,或者打开由lpFile参数指定的文件或文件夹。explort:表示打开由lpFile参数指定的文件夹。print:表示打印由lpFile参数指定的文件。)
lpParameters:若lpFile参数是一个可执行文件,则此参数指定命令行参数,否则此参数应设为NULL。
lpDirectory:用于指定默认目录
nShowCmd:用于指定程序窗口初始显示方式。
#define SW_HIDE             0    /*隐藏窗体,并激活另一个窗体*/
#define SW_SHOWNORMAL       1     /*与SW_RESTORE相同*/
#define SW_SHOWMINIMIZED    2     /*激活并以最小化的形式显示窗体*/
#define SW_SHOWMAXIMIZED    3      /*激活并以最大化的形式显示窗体*/
#define SW_MAXIMIZE         3      /*最大化指定的窗体*/
#define SW_SHOWNOACTIVATE   4       /*以上次的状态显示指定的窗体,但不激活它*/
#define SW_SHOW             5      /*激活窗体,并将其显示在当前的大小和位置上*/
#define SW_MINIMIZE         6      /*最小化指定的窗体,并激活另一个窗体*/
#define SW_SHOWMINNOACTIVE  7       /*以最小化形式显示指定的窗体,但不激活它*/
#define SW_SHOWNA           8       /*以当前的状态显示指定的窗体,但不激活它*/
#define SW_RESTORE          9       /*以原本的大小和位置,激活并显示指定的窗体*/
#define SW_SHOWDEFAULT      10      /*设置显示的状态由STARTUPINFO结构体指定*/
    //打开计算器
	ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWMAXIMIZED);

	//打开指定的应用程序
	ShellExecute(NULL, "open","C:\\Program Files (x86)\\Notepad++\\notepad++.exe",NULL,NULL,SW_SHOWMAXIMIZED );
	ShellExecute(NULL, "open", "notepad++.exe",NULL, "C:\\Program Files (x86)\\Notepad++",SW_SHOWMAXIMIZED );

    //打开一个指定的文件:
	ShellExecute(NULL,"open", "F:\\C\\MFC\\MFC.pdf",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"open", "MFC.pdf",NULL,"F:\\C\\MFC\\",SW_SHOWMAXIMIZED );

    //打开一个指定的文件:

	ShellExecute(NULL,"open", "F:\\C\\MFC\\MFC.pdf",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"open", "MFC.pdf",NULL,"F:\\C\\MFC\\",SW_SHOWMAXIMIZED );

	//打开一个指定的文件夹:

	ShellExecute(NULL, "open", "F:\\C\\MFC",NULL,NULL,SW_SHOWMAXIMIZED );  
	ShellExecute(NULL, "open", NULL,NULL,"F:\\C\\MFC",SW_SHOWMAXIMIZED );  
	ShellExecute(NULL,"explore", NULL,NULL,"F:\\C\\MFC",SW_SHOWMAXIMIZED );

	//打开URL:

	ShellExecute(NULL, "open", "http://tmxk.org/2012/", NULL, NULL,SW_SHOWMAXIMIZED );

2.WinExec

UINT WINAPI WinExec( __in LPCSTR lpCmdLine,__in UINT uCmdShow);

lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

优点: 
  启动新进程后会立即返回,因此你的程序无需等待。 
  通过参数uCmdShow,可以一定程度上控制窗体的显示,比如让它后台运行而不显示出来。 

缺点: 
  它完全与本进程脱离,无法对做些必要的控制 
  无法得知启动的程序是否退出。 
  得不到启动的程序的退出码。 
  不能打开txt文件或网址

WinExec("D:\\QT\\5.9.6\\mingw53_32\\bin\\assistant.exe",SW_SHOW);

3.system

//打开某程序
system("start D:\\QT\\5.9.6\\mingw53_32\\bin\\assistant.exe");

//第一个大叉用来控制背景色,第二个用来控制字体色
/*颜色属性由两个十六进制数字指定 -- 第一个对应于背景,第二个对应于前景。每个数字可以为以下任何值:
	0 = 黑色       8 = 灰色
	1 = 蓝色       9 = 淡蓝色
	2 = 绿色       A = 淡绿色
	3 = 浅绿色     B = 淡浅绿色
	4 = 红色       C = 淡红色
	5 = 紫色       D = 淡紫色
	6 = 黄色       E = 淡黄色
	7 = 白色       F = 亮白色*/
system(“color Xx”);
//清屏
system("sls");  
//设置窗口名称
system("title 名字");
//显示当前时间
system("time /T"); 
//显示当前日期
system("date /T");
//控制窗口的大小,数字1控制长,数字2控制高。
system("mode con cols=60 lines=30");
system("mode 数字1,数字2");

4.CreateProcess

INBASEAPI
BOOL
WINAPI
CreateProcessA(
    __in_opt    LPCSTR lpApplicationName,
    __inout_opt LPSTR lpCommandLine,
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in        BOOL bInheritHandles,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOA lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
    );
WINBASEAPI
BOOL
WINAPI
CreateProcessW(
    __in_opt    LPCWSTR lpApplicationName,
    __inout_opt LPWSTR lpCommandLine,
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in        BOOL bInheritHandles,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCWSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOW lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
    );
#ifdef UNICODE
#define CreateProcess  CreateProcessW
#else
#define CreateProcess  CreateProcessA
#endif // !UNICODE

lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
lpCommandLine:指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
lpThreadAttributes:同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
bInheritHandles:指示新进程是否从调用进程处继承了句柄。如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。
dwCreationFlags:指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
lpEnvironment:指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
lpCurrentDirectory:指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。
lpStartupInfo:指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
lpProcessInformation:指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
    QString program = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
	STARTUPINFO si; //一些必备参数设置
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	PROCESS_INFORMATION pi; //必备参数设置结束
	if (CreateProcess(NULL,(LPWSTR)program.utf16(),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
	{
		qDebug()<

5.QProcess

    QString program = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
	QStringList arguments;
	QProcess *myProcess = new QProcess(parent);
	myProcess->start(program, arguments);

    在qt项目中启动cmd.exe,是在父进程的cmd中运行
    qt5.9中
    typedef QProcess::CreateProcessArgumentModifier


    QProcess process;
    process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args)
    {
        args->flags |= CREATE_NEW_CONSOLE;
        args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
        args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
        args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
                                        | FOREGROUND_INTENSITY;
    });
    process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");

    可以在新的cmd中运行
    



    //可以弹出cmd  qt4.7
    QString program = "F:\\example\\vs2010\\test1\\test2.exe";
	QProcess p;
	p.startDetached("F:\\example\\vs2010\\test1\\test2.exe",
		QStringList(),
		"F:\\example\\vs2010\\test1");

你可能感兴趣的:(windows)