在c++中调用*.exe可执行程序的方法怎样加载其他的应用程序?三个SDK函数winexec,shellexecute,createprocess可以使用。WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如用SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。ShellExecute较WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开c:\temp\1.txt,而不用加载与txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示ReadmeorFaq,我猜就是这么作的啦.ShellExecute(NULL,NULL,_T(1.txt),NULL,_T(c:\\temp),SW_SHOWMAXMIZED)CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:STARTUPINFOstinfo//启动窗口的信息PROCESSINFOprocinfo//进程的信息CreateProcess(NULL,_T(notepad.exe),NULL,NULL.FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&stinfo,&procinfo)常用举例:1、函数:system(C:\ProgramFiles\WindowsNT\hypertrm.exe);2、调用EXE文件有个比较简单的方法就是这样WinExec(c:\\windows\\system32\\cmd.exe,1);3、调用打开EXE文件的方法最方便的就是使用ShellExecute函数,格式就是一楼所提到的那样,fully_qualified_path_to_folder为你exe文件所在路径,例如:X:\\XXX\\XXX.exe,另外该函数还能打开ie网页和其他各种类型的文件(txt,bmp,jpg,mp3,avi,wmv等等),只要是系统能够识别的都能打开ShellExecute(handle,open,fully_qualified_path_to_folder,NULL,NULL,SW_SHOWNORMAL);这个不可思议的函数就是:ShellExecute,取代了WinExec。你可以给它任何文件的名字,它都能识别出来并打开它。例如:ShellExecute(NULL,open,iloveu.bmp,NULL,NULL,SW_SHOWNORMAL);用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是MicrosoftPaint,AdobePhotoshop,或者CorelPhotoPaint。有关ShellExecute的详细用法信息自己去参考有关资料吧,重要的是你知道了这个函数能打开任何文件,甚至是桌面和URL快捷方式(.ink或.url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute返回打开文件的应用的实例句柄。更奇妙的是ShellExecute不仅能打开机器上的文件,还能打开Internet的站点地址。例如:ShellExecute(NULL,open,);这个代码使你能访问微软的主页。当ShellExecute遇到文件名前面的“http:”时,可以判断出要打开的文件是Web文件,随之启动InternetExplorer或者NetscapeNavigator或者任何你使用的别的浏览器打开文件。ShellExecute还能识别其它协议,象FTP、GOPHER。甚至识别“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它启动电子邮件程序并打开一个待编辑的新邮件。总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,它的用法参见有关文档。现在,你知道了ShellExecute的秘密,用它很容易增加一个链接到你的About对话框。不是吗。:)Q&AQ:如何打开一个应用程序?ShellExecute(this-m_hWnd,open,calc.exe,,,SW_SHOW);或ShellExecute(this-m_hWnd,open,notepad.exe,c:\\MyLog.log,,SW_SHOW);正如您所看到的,我并没有传递程序的完整路径。Q:如何打开一个同系统程序相关连的文档?ShellExecute(this-m_hWnd,open,c:\\abc.txt,,,SW_SHOW);Q:如何打开一个网页?ShellExecute(this-m_hWnd,open,);Q:如何激活相关程序,发送EMAIL?ShellExecute(this-m_hWnd,open,mailto:nishinapp@yahoo.com,,,SW_SHOW);Q:如何用系统打印机打印文档?ShellExecute(this-m_hWnd,print,c:\\abc.txt,,,SW_HIDE);Q:如何用系统查找功能来查找指定文件?ShellExecute(m_hWnd,find,d:\\nish,NULL,NULL,SW_SHOW);Q:如何启动一个程序,直到它运行结束?SHELLEXECUTEINFOShExecInfo={0};ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd=NULL;ShExecInfo.lpVerb=NULL;ShExecInfo.lpFile=c:\\MyProgram.exe;ShExecInfo.lpParameters=;ShExecInfo.lpDirectory=NULL;ShExecInfo.nShow=SW_SHOW;ShExecInfo.hInstApp=NULL;ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess,INFINITE);或:PROCESS_INFORMATIONProcessInfo;STARTUPINFOStartupInfo;//Thisisan[in]parameterZeroMemory(&StartupInfo,sizeof(StartupInfo));StartupInfo.cb=sizeofStartupInfo;//Onlycompulsoryfieldif(CreateProcess(c:\\winnt\\notepad.exe,NULL,NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo)){WaitForSingleObject(ProcessInfo.hProcess,INFINITE);CloseHandle(ProcessInfo.hThread);CloseHandle(ProcessInfo.hProcess);}else{MessageBox(Theprocesscouldnotbestarted...);}Q:如何显示文件或文件夹的属性?SHELLEXECUTEINFOShExecInfo={0};ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask=SEE_MASK_INVOKEIDLIST;ShExecInfo.hwnd=NULL;ShExecInfo.lpVerb=properties;ShExecInfo.lpFile=c:\\;//canbeafileaswellShExecInfo.lpParameters=;ShExecInfo.lpDirectory=NULL;ShExecInfo.nShow=SW_SHOW;ShExecInfo.hInstApp=NULL;ShellExecuteEx(&ShExecInfo);或BOOLret=0;STARTUPINFOinfo;memset(&info,0,sizeof(info));info.cb=sizeof(info);info.dwFlags=STARTF_USESHOWWINDOW;info.wShowWindow=show_hide;SW_HIDE;PROCESS_INFORMATIONpinfo;pinfo.hProcess=NULL;pinfo.hThread=NULL;pinfo.dwProcessId=NULL;pinfo.dwThreadId=NULL;ret=CreateProcess(NULL,szExePath,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&info,&pinfo);C++调用exe文件当项目比较大的时候,通常会分开来开发,如果分开的部分只是一些函数或类,整合的时候就可以使用静态库或动态库。但如果分开的是一个exe文件,整合的时候,就要通过调用exe文件来使用。尤其是当第三方软件是一个用c语言编写的exe文件时,更是需要如此。最近在我所开发的LCDS系统当中就碰到了这样的问题。他需要调用一个分类器来处理数据,而手头上的分类器是经典的C4.5决策树分类器,它是用c语言写的,没有.h头文件,生成的是一个exe文件,通过在命令行执行main函数来处理数据。如果想把其改成静态库或动态库,因为没有头文件,改写后似乎不好调用其函数,因此考虑直接调用其生成的exe文件。可考虑的方法有:1.使用system函数2.使用execl或execv函数3.使用WinExec函数4.使用CreateProcess函数5.使用ShellExecuteEx函数system函数和execl、execv函数不能控制程序窗口是否显示,我要的效果是不显示该exe程序的窗口,所以这两种方法不予考虑。WinExec函数不好控制主程序来等该exe程序的结束,所以放弃。CreateProcess函数是新建一个进程,所以,你必须人为地控制该进程的生死,不如ShellExecuteEx方便,所以最终我选择的是ShellExecuteEx函数。程序如下:SHELLEXECUTEINFOShExecInfo={0};ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd=NULL;ShExecInfo.lpVerb=_T(open);ShExecInfo.lpFile=_T(c4.5.exe);ShExecInfo.lpParameters=_T(-ftrain);ShExecInfo.lpDirectory=NULL;ShExecInfo.nShow=SW_HIDE;ShExecInfo.hInstApp=NULL;ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecI