要在应用程序中启动其他的应用程序,有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. JS trim()方法使用

    JS trim()方法使用上有浏览器限制: 1.直接使用 string.trim() 浏览器版本限制:JavaScript Version 1.8  2.间接使用<即自己使用正则构造类trim的 ...

  2. spring DI原理

    什么是IOC? 也称依赖注入 当一个类,需要另一个类的时候,我们不需要再另一个类里进行创建 对象,spring容器会给我们自动的创建 IOC的实现? 通过一定的技术读取spring.xml文件信息,比 ...

  3. Win7_关闭休眠文件hiberfil.sys

    1. C盘根目录下 hiberfil.sys 占用好几G空间,直接删 删不掉,也不推荐直接删. 2. 2.1.命令窗口中输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil. ...

  4. [转载] linux cgroup

    原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...

  5. Html表单的正则校验--将不符合指定正则表达式的字符串自动替换为空

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  6. 出现Warning:Gradle version 2.10 is required. Current version is 2.8.

    Warning:Gradle version 2.10 is required. Current version is 2.8. If using the gradle wrapper, try ed ...

  7. 通用 PE 工具箱1.9.6(XP内核)by Uepon(李培聪)

    通用 PE 工具箱1.9.6(XP内核)by Uepon(李培聪)官网:http://hi.baidu.com/uepon?page=21.8版论坛帖子:http://bbs.wuyou.net/fo ...

  8. qq 换密保方法 只要有密保就好换手机

    特别提醒:必须先绑定手机再做其它操作!!否则有几率冻结更换密保手机号后审核时间2-12小时,请您确定审核通过后再使用(本链接所有号码不需要挂七天常用IP即可绑定手机后改密)电脑换绑定手机方法:复制账号 ...

  9. ios app 支持 ipv6-only

    最近苹果公司发布声明:自今年6月1日开始,所有提交至苹果App Store的应用申请必须要兼容面向硬件识别和网络路由的最新互联网协议--IPv6-only标准. 那么问题来了,目前的app是否支持ip ...

  10. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...