VC中调用外部程序方式总结

简介:
目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了《 vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess 》,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题)。
三个SDK函数: WinExecShellExecute ,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上说明),另外,这两者的先后顺序不能变。
(二)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说需要的)。另外这两者的先后顺序不能变。
(三)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上说明),另外,这两者的先后顺序不能变。
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的! 
关于三个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的当前路径。所以,一定要注意。
可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/196966,如需转载请自行联系原作者

相关文章
|
Web App开发
Python+selenium 技术篇-浏览器后台运行
Python+selenium 技术篇-浏览器后台运行
964 0
|
数据安全/隐私保护 iOS开发
Apple Music中的DRM保护
苹果音乐(Apple Music)是一种流媒体音乐服务,为用户提供了广泛的音乐内容。然而,为了保护音乐版权,Apple Music使用数字版权管理(DRM)技术对其音乐进行保护。DRM保护是一种加密技术,旨在防止用户未经授权地复制、传播或修改受版权保护的音乐。
1846 1
|
网络协议 网络性能优化 算法
iptables深入解析-mangle篇
      讲了filter、ct、nat 现在剩下最后一个知名模块mangle,但是自身虽然知道内核支持修改数据包的信息,它主要用在策略路由和qos上.我们就具体分析一下.      mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(T...
7923 0
|
10月前
|
机器学习/深度学习 人工智能 API
大模型推理服务全景图
国内大模型推理需求激增,性能提升的主战场将从训练转移到推理。
1090 88
|
Ubuntu Linux 编译器
MinGW-w64在windows/ubuntu上的安装及使用
MinGW-w64在windows/ubuntu上的安装及使用
1817 0
|
12月前
|
Python
如何将代码量迅速提升到一万行
如何将代码量迅速提升到一万行
|
9月前
|
运维 监控
阿里云操作系统控制台:让集群管理变得轻松又高效
你是如何监控服务器状态的,一台直接看控制台,那我问你,几十台服务器组成的集群,有没有简单快捷的管理工具? 那我问你,现在有一款运维控制管理平台,可以一眼看到你的所有集群服务器的情况,要不要试一试。 阿里云的操作系统控制台,有了它,管理服务器集群就像看“全景图”一样,一目了然,轻松又高效!
197 3
|
12月前
|
安全 数据安全/隐私保护
如何搭建政务服务网站?政务服务网站包含哪些内容?
政务网是公众获取政府信息的重要渠道,但在信息公开程度、在线服务内容等方面存在不足。为了提高政务网站的效率和质量,需要整合信息资源、清晰导航规划、在线服务、数据开放和确保网站信息安全与隐私保护。
245 13
|
12月前
|
数据可视化 搜索推荐 BI
想在媒体出版业高效协作?哪六款办公软件是绝佳选择?
在竞争激烈的媒体与出版行业,高效的团队协作至关重要。本文推荐 6 款可视化团队协作办公软件,包括板栗看板及 5 款国外小众软件,助力团队提升工作效率,优化内容生产流程。板栗看板以其简洁的操作界面、强大的任务管理功能、丰富的可视化元素、高效的团队协作与沟通以及数据统计与分析功能,成为国内媒体与出版团队的得力助手。Trello、Asana、Monday.com 和 Wrike 等国外软件也在各自领域表现出色,适合不同需求的团队选择。
169 0