MFC 打开外部EXE文件的三种方法
目前知道三种方式: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,,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 的其他注意事项:
、定义头文件
原作者的内容删去。
这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include "stdafx.h"之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的)
、定义路径
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)
、注意文件的路径
在程序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(, "open", "http://askpro.yeah.net", NULL, NULL, );
另外,参考QA000583 "外调一个DOS程序,但是又不想显示其产生的窗口"。
Vc 5.0
Windows
我正在编写一个程序,想外调一个现成的Com,但是又不想显示其产生的窗口,我试过可以关闭该窗口,一样能运行,可是在我的程序中如何获取该窗口句柄,如何自动关闭它?(飞飞)
其实使用ShellExecute调用DOS程序时可以不显示窗口,如:
ShellExecute(, "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 ;
}
#include "stdafx.h"
#include
#include
#include
DWORD WINAPI ThreadWork(LPVOID num)
{
printf("%d\n",num);
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadID[];
HANDLE threadhandle=CreateThread(NULL,
,
ThreadWork,
(LPVOID),//传递的参数
,
&dwThreadID[]);
getchar();
return ;
}
http://blog.csdn.net/samdy1990/article/details/16919969
目前知道三种方式: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;
}
MFC 打开外部EXE文件的三种方法的更多相关文章
- VC中加载LIB库文件的三种方法
VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...
- VC6.0加载lib文件的三种方法
MFC编写程序,都要用到动态链接库,MFC相关的动态库有MFCD42和MFC42等,MFC框架程序已经自动加载,那么如何引入第三方的动态链接库到工程中呢? 静态链接库是要先把程序中所需要使用的函数编译 ...
- Qt 添加外部库文件(四种方法)
Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...
- java将doc文件转换为pdf文件的三种方法
http://feifei.im/archives/93 —————————————————————————————————————————————— 项目要用到doc转pdf的功能,一番google ...
- Node.js写文件的三种方法
Node.js写文件的三种方式: 1.通过管道流写文件 采用管道传输二进制流,可以实现自动管理流,可写流不必当心可读流流的过快而崩溃,适合大小文件传输(推荐) var readStream = fs. ...
- Logstash处理json格式日志文件的三种方法
假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JS ...
- Python实现下载文件的三种方法
下面来看看三种方法是如何来下载zip文件的:方法一: import urllib print "downloading with urllib" url = 'http://www ...
- Viewing the interface of your Swift code,查看Swift代码的头文件的三种方法
Technical Q&A QA1914 Viewing the interface of your Swift code Q: How do I view the interface ...
- python下载文件的三种方法
Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...
随机推荐
- idea远程debug调试设置
1.idea设置 1.1 加入Tomcat Server选择Remote 1.2:设置对应的參数 xxx.xxx.152.67:8080为远程Tomcatserver的IP地址和port,这里能够设置 ...
- C++轮子队-软件需求规格说明书
团队Github项目仓库 软件规格需求说明书 引言 编写目的 软件规格需求说明书书了“2048俄罗斯方块”1.0版本的软件功能性需求和非功能性需求. 文档约定 描述编写文档时所采用的标准或排版约定,包 ...
- Integer类分析(jdk8)
一.构造函数 1. Integer类继承Number类,实现Comparable接口,重写了compareTo()方法. 2. Integer最小值为-2147483648,最大值为214748364 ...
- 在Blender上安装RenderMan插件
2018/3/27 Download and Install Blender itself Download RenderMan Installer (Need to register an acco ...
- DataBase project physical design
DataBase physical design //Table: /*student*/ create table student( id int not null primary key, /*学 ...
- Oracle:Create, alter, drop and add!
Oacle 下对标下元素约束条件的添加与删除 插入元素 alter table table_name add add_name data_type; 添加约束条件 NOT NULL alter tab ...
- 深入了解ZooKeeper(二)
在上篇博客<<深入了解ZooKeeper(一)>>中我们知道了分布式协调技术.分布式锁的实现和zookeeper服务机制,接下来将进一步了解zookeeper究竟能为我们做了什 ...
- 剑指offer-第五章优化时间和空间效率(连续子数组的最大和)
题目:输入一个数组,数组中有正也有负,数组中连续的一个或者连续的多个数字组成一个子数组.求所有的子数组和的最大值.要求时间复杂度为O(n) 思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然 ...
- C# 通过窗口句柄获取程序路径 图标
转自:http://qqhack8.blog.163.com/blog/static/11414798520113363829505/ C# 通过窗口句柄获取程序路径 图标using System;u ...
- Jam的计数法
Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...