要在应用程序中启动其他的应用程序,有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. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  2. ORACLE数据库DBMS_JOB的创建与使用

    http://my.oschina.net/u/2309120/blog/371437 创建 DBMS_JOB 使用以下语句: VARIABLE jobno number;begin DBMS_JOB ...

  3. Git开源项目工作流程图

  4. heaters

    https://leetcode.com/problems/heaters/ 开始的时候,下面的代码对于两边数字完全一样的情况,测试不通过.原因是heater会有重复情况,这时候对于飘红部分就不会往前 ...

  5. Jump Game II

    Description: Given an array of non-negative integers, you are initially positioned at the first inde ...

  6. Object Pascal 语言基础

    Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...

  7. h5 input file ajax实现文件上传

    <input type="file" accept="image/*" height="0" class="file_inp ...

  8. 【转】java多态详解

    1.        Java中除了static和final方法外,其他所有的方法都是运行时绑定的.private方法都被隐式指定为final的,因此final的方法不会在运行时绑定.当在派生类中重写基 ...

  9. python 键值对的树实现

    #coding:utf-8 __author__ = 'similarface' class KeyedBinaryTree: def __init__(self):self.tree=EmptyNo ...

  10. js封装,一个JS文件引用多个JS文件

    (function() { //加载   varobj =  {};   /**    * 动态加载脚本函数    * @param url 要加载的脚本路径    * @param callback ...