MFC 打开外部文件 WinExec,ShellExecute ,CreateProcess
2010年07月30日
目前知道三种方式: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/ms687 393[/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", " http://www.google.com/ ", NULL, NULL, SW_SHOWNORMAL); // 打开网页 www.google.com
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/bb762 153[/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/ms682 425[/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的当前路径。所以,一定要注意。
可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。
VC++6.0
Win95
如何在VC++中调用外部的DOS程序?它的函数是什么?如果用API,它的函数是什么?
回答:
你可以使用Windows API函数WinExec、ShellExecute。这两个函数可以调用Windows和DOS程序。WinExec主要运行EXE文件。如:
WinExec("Notepad.exe Readme.txt", SW_SHOW);
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。如:
ShellExecute(0, "open", "http://askpro.yeah.net", NULL, NULL, 0);
另外,参考QA000583 "外调一个DOS程序,但是又不想显示其产生的窗口"。
Vc 5.0
Windows 95
我正在编写一个程序,想外调一个现成的Com,但是又不想显示其产生的窗口,我试过可以关闭该窗口,一样能运行,可是在我的程序中如何获取该窗口句柄,如何自动关闭它?(飞飞)
其实使用ShellExecute调用DOS程序时可以不显示窗口,如:
ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);
对于你的问题,你可以使用FindWindow获得句柄,但关掉窗口就不能再继续执行了。而你说的关闭窗口还能执行,大概是因为在你关闭窗口时已经运行结束了。
#include "stdafx.h"
#include
#include //ShellExecute 要引用的库
int main(int argc, _TCHAR* argv[])
{
ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW);
getchar();
return 0;
}
#include "stdafx.h"
#include
#include
#include
DWORD WINAPI ThreadWork(LPVOID num)
{
printf("%d\n",num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadID[5];
HANDLE threadhandle=CreateThread(NULL,
0,
ThreadWork,
(LPVOID)2,//传递的参数
0,
&dwThreadID[0]);
getchar();
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangxinyu/archive/2010/03/18 /5393037.aspx
MFC 打开外部文件 WinExec,ShellExecute ,CreateProcess相关推荐
- notebook打开外部文件_CAD外部参照真是个好东西!
好课推荐: 零基础CAD:点我CAD室内:点我 周站长CAD:点我CAD机械:点我 Bim教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我 ps教程:点我苹果版CAD:点我 3dmax教程:点 ...
- Android应用打开外部文件
我们有时候遇到要打开一个文件,我们可以选择用其他应用打开,这时弹出来的应用列表,那么我们如何让自己开发的应用也能出现在里面呢? 第一步:设置启动Activity的intent-filter,给data ...
- 调用外部文件(ShellExecute)
有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateP rocess因为使用复杂,比较少用. WinExec主要运行EXE文件.如: W ...
- MFC打开一个文件方法汇总
第1个回答 CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOOL bOpenFileDi ...
- 怎么打开外部文件_保存的DWG文件再次用CAD打开时提示文件损坏了怎么办?【AutoCAD教程】...
i 点击蓝色字关注我哟 ☀每天推送CAD软件安装及下载.CAD工具应用.CAD技巧.CAD教程.CAD素材.CAD疑难问题解答等文章 ☀想认识志同道合的朋友一起学习CAD?请加入我们的QQ群 369 ...
- wm6 打开外部文件方法
static void Main() { //声明一个程序信息类 System.Diagnostics.ProcessStartInfo Info = new ...
- MFC打开/保存文件
转载于https://www.shuzhiduo.com/A/gGdXPXgWd4/ CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDi ...
- WinExec打开exe文件
1,WinExec(): WinExec主要运行EXE文件,不能运行其他类型的文件.不用引用特别单元. 原型:UINT WinExec(exePath,ShowCmd) 示例,我想要用记事本打开&qu ...
- 文本编辑器实现打开帮助文件的功能
文章目录 1 文本编辑器实现打开帮助文件的功能 1 文本编辑器实现打开帮助文件的功能 打开外部文件: QDesktopServices提供了一系列桌面开发相关的服务接口. 通过QDesktopServ ...
最新文章
- 记录一次没有收集直方图优化器选择全表扫描导致CPU耗尽
- Android View 事件分发机制详解
- 35+的互联网人都哪去了
- oracle中行数少于1000,oracle中in的个数超过1000的解决办法
- matlab将模型解封装,模型保护
- MATLAB Simulink
- MathWorks 中国
- 《基于Java实现的遗传算法》笔记(7 / 7):个人总结
- .NET Core通讯模块在Linux下的性能测试
- 三菱st语言编程实例_C语言编程实例39
- Linux登录时执行
- Microsoft .NET Framework 3.5 SP1 简体中文精简版+.net
- deepin V20.2版本安装MySQL
- 专家全方位剖析网页木马
- 使用Qt开发2D“沙盒”小游戏
- Dialog确认按钮不dismiss
- SAP HANA SDA实战
- 什么是真正的互联网思维?
- 课程设计------学生考勤管理系统
- OpenStack裸金属ironic组件web-console界面定制
- 操作系统 -- 哲学家就餐问题
- 日本综合交通枢纽集约式发展经验
热门文章
- P2P之UDP穿透NAT的原理与实现 [转]
- 短整型转字符数组,字符数组转短整型
- 透彻说明反正切atan2函数比反正切atan函数的区别
- 还在转发杨超越?参加这场图表大show,你就能成为锦鲤本鲤!
- 成功解决ValueError: Unknown metric function:***
- HAproxy的配置详解
- python读取哨兵卫星数据_科学网—【Python】批量下载Sentinel-2卫星数据 - 江佳乐的博文...
- 主流webgis框架介绍与对比
- 十四、nrf52832的pwm
- 计算机毕业设计SSM选题推荐 企业培训管理系统 艺术类培训中心管理系统 企业销售人员培训系统