C++中运行外部程序.doc_第1页
C++中运行外部程序.doc_第2页
C++中运行外部程序.doc_第3页
C++中运行外部程序.doc_第4页
C++中运行外部程序.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:【1】定义头文件必须定义以下两个头文件:#include / 可替换为 windows.h#include 如果定义了头文件 #include 的话就不必定义 #include 了。【2】定义路径C+中所表示的路径要用 而不是平常所用的 ,所以以上三个函数表示路径都为:disk:Directory.File nameWinExec(D:Program FilesTestTest.exe,SW_SHOWMAXIMIZED);ShellExecute(NULL,open,C:Test.txt,NULL,NULL,SW_SHOWNORMAL);1、调用API: int system( const char *command ); 你可以传入一命令,启动某个程序。如ping , YourExe等等 不过这里有几点要值得注意: (1)、他不会立即返回,直到你启动的程序执行完成。 (2)、如果你启动是windows程序,它仍然会启动一个控制台,这就给人感觉太差劲了,但如果本身是控制台的,而且又需要等待它的完成,那这将是比较好的选择。 (3)、它的返回值代表是否执行成功以及程序的退出码。(4)、不能运行*.txt文件或2、调用API: UINT WinExec( LPCSTR lpCmdLine, / command line UINT uCmdShow / window style ); 返回是否调用成功,如果大于32则调用成功这个API与API:system同样的使用简单,同用是使用命令行型式。 不过它与API:system相比,有几个优点: (1)、它将启动了一个新进程,并且立即返回,因此你的程序无需等待。 (2)、它的多了一个参数:uCmdShow,通过它你可以一定程度上控件窗体的显示,比如让它后台运行而不显示出来。 (3)、它无论启动控制台程序还是windows程序都只做你想要做的事。 它的不足之处: (1)、它完全与本进程脱离,无法对做些必要的控制 (2)、无法得知启动的程序是否退出。 (3)、得不到启动的程序的退出码。 (4)、不能运行*.txt文件或3、调用: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpVerb, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); 它也有WinExec同样的缺点。 它虽然传回一个HINSTANCE,但他并不是真正的句柄,我们仅能拿它来做一些错误值检查。 但它的功能比前两者更强大,它执行系统的Shell命令。 1、2中如果传入“XX.txt”,它们将不能成功执行,ShellExecute却能很好地执行,它将启动一个默认的文字处理程序来打开它。 1、2中如果传入“”,将不能成功执行,而ShellExecute却能很好地执行,它将启动一个默认浏览器来打开这个网站。 参数讲解: 参数1hwnd:一窗体句柄,将作为启动的程序的父窗体。 参数2lpVerb:你想执行的操作(edit 、explore、find、open、print、properties),你也可以传入NULL值,它将执行默认操作(win2000以前与以后处理略有差别,请见MSDN)。 参数3lpFile:一文件名或操作的对象。 参数4lpParameters:如果lpFile是一可执行文件,这个将作为它的参数。它的格式由执行的操作决定。而且当lpFile为一document文件时,此参数需为NULL。 参数5lpDirectory:指定它的工作目录。 参数6nShowCmd:窗体显示的控制。 以下是几个例子: /启动一个Dos命令, 启动windows程序相同 :ShellExecute(this-GetSafeHwnd(), NULL, ping, , NULL, SW_SHOWNORMAL); /打开一个文件 :ShellExecute(this-GetSafeHwnd(), open, ReadMe.txt, NULL, NULL, SW_SHOWNORMAL); /上面的动词可传可不传,但如果ReadMe.txt为ReadMe.bat那就得指定,否则将会当命令执行,而不是打开它。 /可打开目录 :ShellExecute(this-GetSafeHwnd(), open, c:, NULL, NULL, SW_SHOWNORMAL); /可打开网页 :ShellExecute(this-GetSafeHwnd(), open, , NULL, NULL, SW_SHOWNORMAL); /浏览一个目录 ShellExecute(handle, explore, c:NULL, NULL, SW_SHOWNORMAL); /查看一个文件或目录的属性 /使用ShellExecuteEx,实现请见所附源码对应部分 如果没有特殊的控制要求,它己能为我们做很了,但当我们一定要能控件这个启动的进程时,那我们就得使用第4点了。 4:调用API: BOOL CreateProcess( LPCTSTR lpApplicationName, / name of executable module LPTSTR lpCommandLine, / command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, / SD LPSECURITY_ATTRIBUTES lpThreadAttributes, / SD BOOL bInheritHandles, / handle inheritance option DWORD dwCreationFlags, / creation flags LPVOID lpEnvironment, / new environment block LPCTSTR lpCurrentDirectory, / current directory name LPSTARTUPINFO lpStartupInfo, / startup information LPPROCESS_INFORMATION lpProcessInformation / process information ); 往往看到这个函数就让人生畏,它参数多,而且参数类型也如此莫生。是的,正是因为如此它才功能强大! 但不要怕,作为一般使用,非常简单!下面便是一个简单的例子(启动记事本): STARTUPINFO StartInfo; PROCESS_INFORMATION pinfo; /对程序的启动信息不作任何设定,全部清0 memset(&StartInfo,0,sizeof(STARTUPINFO); StartInfo.cb = sizeof(STARTUPINFO);/设定结构的大小 BOOLret=CreateProcess( NULL, /启动程序路径名 notepad.exe, /参数(当exeName为NULL时,可将命令放入参数前) NULL, /使用默认进程安全属性 NULL, /使用默认线程安全属性 FALSE,/句柄不继承 NORMAL_PRIORITY_CLASS, /使用正常优先级 NULL, /使用父进程的环境变量 NULL, /指定工作目录 &StartInfo, /子进程主窗口如何显示 &pinfo); /用于存放新进程的返回信息 这样在创建成功这后我们就可以从pinfo中找到它的:进程句柄,线程句柄,进程ID,线程ID 在附件源码中演示了进程序的启动,停止。 实际上我们可以通过很多方式如内存共享、父进程窗体句体传入仍后从消息中获得子进程窗体句柄等,来实现更多的控制。 想很好地掌握CreateProcess,可参见人民邮电出版社出版的,它的“进程”部份作了很详尽的说明。例程:#include#include#includevoidmain()HWNDhandle;printf(Function:nItcanrunacmdcommand,butcantopen*.txtandwww.*.*n);printf(PleasepressEntergoonn);getchar();WinExec(mspaint.exe,SW_SHOWNOACTIVATE);/*winexec不能打开网站或txt文件*/printf(Function:nItcanrunacmdcommandtoopenfileorwebnn);getchar();printf(Openatxtfilen);ShellExecute(NULL,open,C:test.txt,NULL,NULL,SW_MINIMIZE);getchar();printf(Openawebn);ShellExecute(NULL,NULL,,NULL,NULL,SW_SHOWNA);getchar();printf(Runacmdcommand:n);ShellExecute(NULL,NULL,ping,,NULL,SW_SHOWNORMAL);getchar();printf(打开目录n);ShellExecute(NULL,open,c:,NULL,NULL,SW_SHOWNORMAL);getchar();printf(浏览目录n);ShellExecute(NULL,explore,c:,NULL,NULL,SW_SHOWNORMAL);getchar();printf(文件属性n);ShellExecute(handle,properties,C:test.txt,NULL,NULL,SW_MINIMIZE);printf(%s,handle);/*shellExecute的第二个参数为你想执行的操作(edit,explore,find,open,print,properties),也可为NULL*/*SW_HIDEHidesthewindowandpassesactivationtoanotherwindow.SW_MINIMIZEMinimizesthespecifiedwindowandactivatesthetop-levelwindowinthesystemslist.SW_RESTOREActivatesanddisplaysawindow.Ifthewindowisminimizedormaximized,Windowsrestoresittoitsoriginalsizeandposition(sameasSW_SHOWNORMAL).SW_SHOWActivatesawindowanddisplaysitinitscurrentsizeandposition.SW_SHOWMAXIMIZEDActivatesawindowanddisplaysitasamaximizedwindow.SW_SHOWMINIMIZEDActivatesawindowanddisplaysitasanicon.SW_SHOWMINNOACTIVEDisplaysawindowasanicon.Thewindowthatiscurrentlyactiveremainsactive.SW_SHOWNADisplaysawindowinitscurrentstate.Thewindowthatiscurrentlyactiveremainsactive.SW_SHOWNOACTIVATEDisplaysawindowinitsmostrecentsizeandposition.Thewindowthatiscurrentlyactiveremainsactive.SW_SHOWNORMALActivatesanddisplaysawindow.Ifthewindowisminimizedormaximized,Windowsrestoresittoitsoriginalsizeandposition(sameasSW_RESTORE).*/附:结束进程:TerminateProcess(pinfo.hProcess,0);CloseHandle(pinfo.hProcess);TerminateProcess()函数执行后,被终止的进程是不会得到任何关于程序退出的通知的。 被终止的进程是无法在结束运行前进行退出前的收尾工作的, 所以,通常只有在其他任何方法都无法迫使进程退出时才会考虑使用TerminateProcess()去强制结束进程的。TerminateProcess函数终止指定进程及其所有线程。 函数原型:BOOL TerminateProcess( HANDLE hProcess,/进程句柄 UINT uExitCode /进程终止码 ); VB声明 Declare Function TerminateProcess Lib kernel32 Alias TerminateProcess (ByVal hProcess As Long, ByVal uExitCode As Long) As Long 说明 结束一个进程 在VB里使用 可以使用,但尽量不用 返回值 Long,非零表示成功,零表示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论