如果是win32程序,需要加上#include "windows.h"。
三个SDK函数:WinExec,ShellExecute,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec两个参数,前一个指定路径,后一个指定显示方式。ShellExecute可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
三个SDK函数(WinExec、ShellExec、CrateProcess)的语法:
WinExec
这个函数最简单,只有两个参数,原型如下:
UINTWinExec(
LPCSTRlpCmdLine,//命令路径
UINTuCmdShow//显示方式
;
使用方法如下:
WinExec("Notepad.exe",SW_SHOW);//打开记事本
WinExec("D://ProgramFiles//Test//Test.exe",SW_SHOWMAXIMIZED);//以最大化的方式打开Test.exe
需要注意的是若用SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,譬如Neterm,Calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
ShellExecute
原型如下:
HINSTANCEShellExecute(
HWNDhwnd,//父窗口句柄
LPCTSTRlpOperation,//操作,打开方式"edit","explore","open","find","print","NULL"
LPCTSTRlpFile,//文件名,前面可加路径
LPCTSTRlpParameters,//参数
LPCTSTRlpDirectory,//默认文件夹
INTnShowCmd//显示方式
);
使用方法如下:
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL);//打开C:/Test.txt文件
ShellExecute(NULL,"open","http://www.google.com",/NULL,NULL,SW_SHOWNORMAL);//打开网页www.google.com
ShellExecute(NULL,"explore","D://C++",NULL,NULL,SW_SHOWNORMAL);//打开目录D:/C++
ShellExecute(NULL,"print","C://Test.txt",NULL,NULL,SW_HIDE);//打印文件C:/Test.txt
ShellExecute不支持定向输出。
CreateProcess
原型如下:
BOOLCreateProcess(
LPCTSTRlpApplicationName,//执行程序名
LPTSTRlpCommandLine,//参数行
//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
LPSECURITY_ATTRIBUTESlpProcessAttributes,//processsecurityattributes
LPSECURITY_ATTRIBUTESlpThreadAttributes,//threadsecurityattributes
BOOLbInheritHandles,//继承标志
DWORDdwCreationFlags,//创建标志
LPVOIDlpEnvironment,//环境变量
LPCTSTRlpCurrentDirectory,//运行该进程的初始目录
LPSTARTUPINFOlpStartupInfo,//用于在创建子进程时设置各种属性
LPPROCESS_INFORMATIONlpProcessInformation//用于在进程创建后接受相关信息
;
使用方法如下:
PROCESS_INFORMATIONpi;
STARTUPINFOsi;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
boolfRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
关于三个SDK函数:WinExec,ShellExecute,CreateProcess的其他注意事项:
1、定义头文件
在头文件stdafx.h中必须定义以下两个头文件:
#include<shlobj.h>//可替换为windows.h
#include<shellapi.h>
如果定义了头文件#include<windows.h>的话就不必定义#include<shlobj.h>了,"windows.h"不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。
2、定义路径
C++中所表示的路径要用"//"而不是平常所用的"/",所以以上三个函数表示路径都为:
Disk://Directory//...//Filename
WinExec("D://ProgramFiles//Test//Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL);
boolfRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);