[转]VC中调用外部exe程序方式

本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html

目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了《vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess》,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题)。
三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess  一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:

(一)WinExec
这个函数最简单,只有两个参数,原型如下:
      UINT WinExec(
      LPCSTR lpCmdLine,   // 命令路径
      UINT uCmdShow      // 显示方式
      );
使用方法如下:
WinExec("Notepad.exe", SW_SHOW);  // 打开记事本
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
这个函数只能打开exe文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms687393[/url](VS.85).aspx 

(二)ShellExecute
原型如下:
      HINSTANCE ShellExecute(
      HWND hwnd,           //父窗口句柄
      LPCTSTR lpOperation,   //操作, 打开方式 "edit","explore","open","find","print","NULL"
      LPCTSTR lpFile,         //文件名,前面可加路径
      LPCTSTR lpParameters,   //参数
      LPCTSTR lpDirectory,    //默认文件夹
      INT nShowCmd          //显示方式
);
使用方法如下:
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:\Test.txt 文件
ShellExecute(NULL, "open", "[url]http://www.google.com/[/url]",  NULL, NULL, SW_SHOWNORMAL); // 打开网页[url]www.google.com[/url]
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不支持定向输出。
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,shellapi.h(前者是我试验出来的,后者是msdn说需要的)。另外这两者的先后顺序不能变。
msdn上说明:[url]http://msdn.microsoft.com/en-us/library/bb762153[/url](VS.85).aspx 

(三)CreateProcess
原型如下:
      BOOL CreateProcess(
      LPCTSTR lpApplicationName, //执行程序名
      LPTSTR lpCommandLine,  // 参数行
      //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
      LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes
      LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes
      BOOL bInheritHandles,  // 继承标志
      DWORD dwCreationFlags, // 创建标志
      LPVOID lpEnvironment,  // 环境变量
      LPCTSTR lpCurrentDirectory,   // 运行该进程的初始目录
      LPSTARTUPINFO lpStartupInfo,  // 用于在创建子进程时设置各种属性
      LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
      );
使用方法如下:
             PROCESS_INFORMATION pi;
                       STARTUPINFO si;
                       memset(&si,0,sizeof(si));
                       si.cb=sizeof(si);
                      si.wShowWindow=SW_SHOW;
                       si.dwFlags=STARTF_USESHOWWINDOW;
                       bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms682425[/url](VS.85).aspx
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:

1、定义头文件
原作者的内容删去。
这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include “stdafx.h”之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的)
2、定义路径
C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:
Disk:\\Directory\\...\\File name
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi)
3、注意文件的路径
在程序a调用程序b的时候,b原来的默认的当前路径都会变成a的当前路径。所以,一定要注意。
可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。
时间: 2024-10-15 23:38:39

[转]VC中调用外部exe程序方式的相关文章

[转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等.    Cr

windows下调用外部exe程序 SHELLEXECUTEINFO

本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: 1 typedef struct _SHELLEXECUTEINFO { 2 DWORD cbSize; 3 ULONG fMask; 4 HWND hwnd; 5 LPCTSTR lpVerb; 6 LPCTSTR lpFile; 7 LPCTSTR lpParameters; 8 LPCTSTR lpD

c# 调用外部exe程序

c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; System.Diagnostics.Process Proc; p = new ProcessStartInfo("nnnn.exe","参数"); p.WorkingDirectory = exepath;//设置此外部程序所在windows目录 p.Window

在Sql Server中调用外部EXE执行程序

exe sql server xp database dos 服务器 一.先开启xp_cmdshell 打开外围应用配置器—> 功能的外围应用配置器—> 实例名\Database Engine\xp_cmdshell—> 启用 二.解决方法 [sql] view plain copy use master Exec xp_cmdshell 'mkdir d:\csj' --调用dos命令创建文件夹,(执行成功了!) [sql] view plain copy Exec xp_cmdshe

使用Qprocess的startDetached()方法调用外部exe程序

使用Qprocess的startDetached()方法,当前程序关闭时,调用的外部程序能够照常运行. QProcess::startDetached("C:\\Qt\\1.exe",QStringList()); 记得在头文件中添加#include <QProcess>,不然编译不通过

VC++中调用cmd的集中方式

1. system方法: 原型: [cpp] view plain copy int __cdecl system(const char *); 例如: [cpp] view plain copy system("ipconfig"); 2. WinExec方法: 相比于system方法,WinExec方法多了一个窗口参数: 原型: [cpp] view plain copy UINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow ); 例如: Wi

VC中调用exe

目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess>,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题). 三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateP

C# ASP.NET Webservice调用外部exe无效的解决方法

最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决方法 本文参考了以下网页,十分感谢 http://bbs.csdn.net/topics/300053869 http://blog.163.com/[email protected]/blog/static/15737970200862331842368/ 环境:win7 sp1 64位 以及II

C#和asp.net执行外部EXE程序

这两天研究下.Net的执行外部EXE程序问题,就是在一个程序里通过按钮或其他操作运行起来另外一个程序,需要传入参数,如用户名.密码之类(实际上很类似单点登录,不过要简单的多的多):总结如下: 1.CS版:WebForm的调用外部程序,很简单 (1)如果不考虑参数问题,仅仅是执行另外一个程序,用:System.Diagnostics.Process.Start("')即可: 如:System.Diagnostics.Process.Start("D:\\首字母拼音码.exe",