三个SDK函数 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 FilesTestTest.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。
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不支持定向输出。
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);
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:
1、定义头文件
在头文件stdafx.h中必须定义以下两个头文件:
#include <shlobj.h> // 可替换为 windows.h
#include <shellapi.h>
如果定义了头文件 #include 的话就不必定义 #include 了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。
2、定义路径
C++中所表示的路径要用 " "而不是平常所用的" ",所以以上三个函数表示路径都为:
Disk:Directory...File name
WinExec("D:Program FilesTestTest.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);
本文所有程序在 Visual Studio.Net 2003 C++ 环境下编写,编译过程没有错误。
测试环境:
Windows XP Home Edition
Visual Studio.Net 2003
分享到:
相关推荐
C++调用Web services的控制台应用程序 C++调用Web services的控制台应用程序
QT通过QProcess调用外部程序 博客地址:https://tinycool.blog.csdn.net/article/details/124359078
C++ 调用EXCEL应用类 程序比较易懂 适合马上要用到学习者
JNI允许运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,允许将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述
可以在C++应用程序中执行JavaScript脚本
C++,动态调用dll,dll也是由c++实现,且实现了回调功能,即应用程序将函数传入到dll,由dll接口调用函数,以实现回调
在 companion object 中还定义了一个名为 staticMethod 的静态方法,它会在应用程序启动时被加载,用于在 Java 层调用本地方法。这个静态方法可以从 Java 代码中直接调用,而不需要使用 JNI 接口函数。 这是 C++ ...
c++ 实现com接口调用demo,COM component(COM组件),即Component Object Model(组件对象模型),是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。COM是开发软件组件的...
现在C++也不行了吗,网上找不到相关代码。为了搞清楚C++中如何使用httpClient和Newtonsoft,研究了一下午。我从未用C++编程,一直用C#,现学现卖。
C++动态库的创建和应用源码,包括TestDll和TestExe两个项目,TestDll是动态库,TestExe调用动态库。
java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在...Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。
使用APIHook钩子截获你的应用程序调用的任何输入函数.zip
C#编写的应用程序调用C#编写的dll
VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程...
通过代码获得程序资源中VS_VERSION_INFO所有信息。
详细的Java通过JNI调用C++的程序实例。
这是mono所需要的所有dll文件,通过这个mono可以实现c#脚本功能,通过c++去调用c#代码,在unity游戏引擎里面就是通过mono实现c#脚本功能的。
有以下函数可供使用: 1初始化文件映射对象 2同步 3获取文件映射对象的映射视图 4释放文件映射对象的映射视图 5释放文件映射对象 源码包含了封装的功能模块类以及测试类...5源码中所有使用StdAfx.h的地方,均改为pch.h
摘要:VC/C++源码,系统相关,调用外部程序 VC++在应用程序中启动其他程序,从自身窗口中通过点击按钮来调用外部程序,很简单的实例,希望VC++初学者下载后认真学习一下这个VC源代码。
:程序员在设计应用程序时, 通常把程序划分为若干功能较为单一的模块, 然后分别予以实现 , 最后再把所有的模 块装配起来。 这种程序设计中分而治之的策略, 被称为模块化程序设计。 C语言中, 函数是程序的基本...