我们在开发项目时,通常需要通过一个程序调用另一个程序,在这里介绍一中在C++程序中调用exe文件的方法:使用ShellExcecuteEx函数。
使用ShellExcecuteEx相对于其他的调用exe的方法,例如:使用system函数,使用exec或者是execv函数,使用WinExec函数,使用CreateProcess函数。前者在前台打开程序、控制权限等发面都有优势,这里首先介绍函数原型,函数原型如下:
BOOL ShellExecuteEx(SHELLEXECUTEINFO pExecInfo),这里有必要对SHELLEXECUTEINFO 数据类型进行一下解释。SHELLEXECUTEINFO 定义如下:
typedef struct _SHELLEXECUTEINFO
{
DWORD cbSize;//通常取值sizeof(SHELLEXECUTEINFO)
ULONG fMask;//常见取值SEE_MASK_NOCLOSEPROCESS
HWND hwnd;//一般为NULL
PCTSTR lpVerb;//打开程序为_T("open")
PCTSTR lpFile;//你要打开的EXE文件的路径。
PCTSTR lpParameters;//可以为空
PCTSTR lpDirectory;//一般取NULL
int nShow;//这个取值较多,有SW_MAXIMIZE,SW_HIDE,SW_NORMAL等等,其用开控制窗口是否显示及大小
HINSTANCE hInstApp;//一般为NULL,下面的不用赋值也行。
PVOID lpIDList;
PCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union
{
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
下面贴出我的代码,在MFC程序中使用:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = _T("open");
ShExecInfo.lpFile = _T(path);
ShExecInfo.lpParameters = _T(" "); //-a a
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE SW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);