Windows API调用外部程序-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

Windows API调用外部程序

简介:
+关注继续查看

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




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2010/12/24/window-api-exe.html,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
c#中跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。首先来看传统方法: public partial class Form1 : Form...
1014 0
Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现
 Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致。
965 0
[已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.
原文: [已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.
1497 0
c++ 使用vs2010调用 win32api
以前读书时都是用vc6.0.后来学c#用vs。装系统只装了vs2010.今天用vs2010写c++程序。发现有点陌生。就总结下,免得以后忘记。   首先用vs2010选择c++语言。新建一个win32控制台程序。
827 0
WinForm如何调用Web Service
参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使。郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是Web.config需要配置,结果WinForm没有这个配置文件,奇怪,为什么人家的就好使,我写的就不好使呢。
729 0
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
 Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2。
975 0
3022
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载