要在应用程序中启动其他的应用程序,有3个函数可以使用,下面我一一说说他们(我以打开D:\Program Files\zeecalls\目录下的zeecalls.exe应用程序为例):

1、Winexec

这个函数最简单,只有两个参数,原型如下:

UINT WinExec(
  LPCSTR lpCmdLine, // address of command line
  UINT uCmdShow // window style for new application
  );

使用方法如下:

WinExec(_T("D:\\Program Files\\zeecalls\\zeecalls.exe"),SW_SHOWMAXIMIZED);

这句话将会以最大化的方式打开zeecalls.exe,需要注意的是,在VC中,‘/’需要以‘//’来写。

2、ShellExecute

shellExecute比WinExex灵活一点,所以参数就要多一点,原型如下:

HINSTANCE ShellExecute(
  HWND hwnd, //父窗口句柄
  LPCTSTR lpOperation,//打开方式
  LPCTSTR lpFile, //待打开的文件名
  LPCTSTR lpParameters, LPCTSTR lpDirectory,//文件路径
  INT nShowCmd );

同样,我们也可以通过这个函数来打开我们需要的文件:

ShellExecute(NULL,_T("open"),_T("zeecalls.exe"),NULL,_T("D:\\Program Files\\zeecalls\\"),SW_SHOWNORMAL);

这句话是以用正常的显示方式打开zeecalls.exe

3、CreateProcess

上面的几种方式都实现了我们在自己的应用程序中打开其他的应用程序的目的,但是,我们没有得到足够多的关于新的进程的信息,也没有使用过多的手段去控制新的进程的细节属性,所以,如果要达到这些目的,我们就需要使用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 //用于在进程创建后接受相关信息
  );

在上面的参数中,使用了两个比较重要的数据结构:STARTUPINFO和PROCESS_INFORMATION。这两个结构的定义分别如下:

typedef struct _STARTUPINFO { // si 
  DWORD cb; //结构长度
  LPTSTR lpReserved; //保留
  LPTSTR lpDesktop; //保留
  LPTSTR lpTitle; //如果为控制台进程则为显示的标题
  DWORD dwX; //窗口横坐标
  DWORD dwY; //窗口丛坐标
  DWORD dwXSize; //窗口宽度
  DWORD dwYSize; //窗口高度
  DWORD dwXCountChars; //控制台窗口字符号宽度
  DWORD dwYCountChars; //控制台窗口字符号高度
  DWORD dwFillAttribute; //控制台窗口填充模式
  DWORD dwFlags; //创建标记
  WORD wShowWindow; //窗口显示标记,如同ShowWindow中的标记
 3、CreateProcess

上面的几种方式都实现了我们在自己的应用程序中打开其他的应用程序的目的,但是,我们没有得到足够多的关于新的进程的信息,也没有使用过多的手段去控制新的进程的细节属性,所以,如果要达到这些目的,我们就需要使用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 //用于在进程创建后接受相关信息
  );

在上面的参数中,使用了两个比较重要的数据结构:STARTUPINFO和PROCESS_INFORMATION。这两个结构的定义分别如下:

typedef struct _STARTUPINFO { // si 
  DWORD cb; //结构长度
  LPTSTR lpReserved; //保留
  LPTSTR lpDesktop; //保留
  LPTSTR lpTitle; //如果为控制台进程则为显示的标题
  DWORD dwX; //窗口横坐标
  DWORD dwY; //窗口丛坐标
  DWORD dwXSize; //窗口宽度
  DWORD dwYSize; //窗口高度
  DWORD dwXCountChars; //控制台窗口字符号宽度
  DWORD dwYCountChars; //控制台窗口字符号高度
  DWORD dwFillAttribute; //控制台窗口填充模式
  DWORD dwFlags; //创建标记
  WORD wShowWindow; //窗口显示标记,如同ShowWindow中的标记
  WORD cbReserved2; //保留参数
  LPBYTE lpReserved2; //保留参数
  HANDLE hStdInput; //标准输入句柄
  HANDLE hStdOutput; //标准输出句柄
  HANDLE hStdError; //标准错误句柄
  } STARTUPINFO, *LPSTARTUPINFO;

typedef struct _PROCESS_INFORMATION { // pi 
  HANDLE hProcess; //进程句柄
  HANDLE hThread; //进程的主线程句柄
  DWORD dwProcessId; //进程的ID
  DWORD dwThreadId; //进程的主线程ID
  } PROCESS_INFORMATION;

作为例子,我们来看看如何使用CreateProcess来打开相同的文件:

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:\\Program Files\\zeecalls\\zeecalls.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
 
  可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,以上几种方法可能有些会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

程序员的网店:http://shop108042866.taobao.com呵呵

凡事以大气象去面对,优秀是一种习惯。

 
分类: VC++
 
好文要顶 关注成功 收藏该文  
 
 
关注成功
3
0
 
 
 

Windows API调用外部程序的更多相关文章

  1. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  2. 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)

    浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...

  3. Windows API 调用示例

    Ø  简介 本文主要记录 Windows API 的调用示例,因为这项技术并不常用,属于 C# 中比较孤僻或接触底层的技术,并不常用.但是有时候也可以借助他完成一些 C# 本身不能完成的功能,例如:通 ...

  4. 使用API调用外部程序并监控程序状态

    Public Type SHELLEXECUTEINFO    cbSize As Long    fMask As Long    hwnd As Long    lpVerb As String  ...

  5. 项目笔记---Windows Service调用Windows API问题

    概要 此文来自于最近一个“诡异”的Windows API调用发现Windows Service在调用某些Windows API的过程中失效,在经过漫长的Baidu,之后终于在StackOverFlow ...

  6. C#调用API向外部程序发送数据

    C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不 ...

  7. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

  8. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  9. 【转】用C#调用Windows API向指定窗口发送

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

随机推荐

  1. iOS - Swift 命令行输入输出

    1.类输出 Swift 语言中类输出方法重: override var description: String{ return String(format: "%@, %@", s ...

  2. iOS - AudioServicesPlay 短频音效播放

    前言 extern void AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID) __OSX_AVAILABLE_STARTING(_ ...

  3. Nginx 的RTMP打流模块配置

    config配置文件: user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; ev ...

  4. 管道寄售库存MRKO结算后,冲销问题

    管道寄售库存MRKO结算后,冲销问题 1.通常使用MIRO对采购订单进行发票校验后,若发现校验错误,直接使用MR8M取消发票校验,同时手工F-03对借发票校验借方GRIR和取消发票校验的贷方GRIR进 ...

  5. Myeclipse 主题下载

    Myeclipse 主题下载 下载网址: 1. 编辑区背景主题:http://www.eclipsecolorthemes.org 2. 框架主题:https://marketplace.eclips ...

  6. http1.1和http1.0区别

    http1.1和服务器建立连接可以获得多个资源 http1.0和服务器建立连接可以获取一个值

  7. 关于远程连接MySQL数据库的问题解决

    安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲配置. 配置MySQL ...

  8. Android性能优化典范(二)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

  9. Swift语言学习之OC和Swift混编

    本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里 ...

  10. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...