• Windows API调用外部程序


    要在应用程序中启动其他的应用程序,有3个函数可以使用,下面我一一说说他们(我以打开D:Program Fileszeecalls目录下的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
     
     
     
    « 上一篇:部署Silverlight及Web Service
    » 下一篇:asp.net调用exe并传递参数然后关闭exe
  • 相关阅读:
    基于Grafana的监控数据钻取功能应用实践
    将Windows下的InfluxDB、Grafana做成Windows服务
    基于InfluxDB实现分页查询功能
    Multipart/form-data POST文件上传详解
    RESTFUL接口
    正则表达式
    Spring Cloud简介
    Spring Boot初识(4)- Spring Boot整合JWT
    Spring Boot初识(3)- Spring Boot整合Swagger
    Spring Boot初识(2)- Spring Boot整合Mybaties
  • 原文地址:https://www.cnblogs.com/zxtceq/p/5889552.html
Copyright © 2020-2023  润新知