1. 目前知道三种方式:WinExecShellExecute CreateProcess,别人已经总结的很好了《vc中调用其他应用程序的方法(函数) winexecshellexecute createprocess》,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题)。
  2.   三个SDK函数: WinExecShellExecute CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecuteWinExec灵活一些,CreateProcess最为复杂。
  3.   WinExec 两个参数,前一个指定路径,后一个指定显示方式。
  4.   ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
  5.   CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
  6.   三个SDK函数( WinExecShellExecCrateProcess )的语法:
  7.   (一)WinExec
  8.   这个函数最简单,只有两个参数,原型如下:
  9.   UINT WinExec(
  10.   LPCSTR lpCmdLine, // 命令路径
  11.   UINT uCmdShow // 显示方式
  12.   );
  13.   使用方法如下:
  14.   WinExec("Notepad.exe", SW_SHOW); // 打开记事本
  15.   WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
  16.   需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如NetermCalc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。
  17.   这个函数只能打开exe文件。
  18.   需要的头文件:windows.hwinbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
  19.   msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms687 393[/url](VS.85).aspx
  20.   (二)ShellExecute
  21.   原型如下:
  22.   HINSTANCE ShellExecute(
  23.   HWND hwnd, //父窗口句柄
  24.   LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"
  25.   LPCTSTR lpFile, //文件名,前面可加路径
  26.   LPCTSTR lpParameters, //参数
  27.   LPCTSTR lpDirectory, //默认文件夹
  28.   INT nShowCmd //显示方式
  29.   );
  30.   使用方法如下:
  31.   ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL); // 打开C:\Test.txt 文件
  32.   ShellExecute(NULL, "open", "http://www.google.com/", NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com
  33.   ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:\C++
  34.   ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL , SW_HIDE); // 打印文件C:\Test.txt
  35.   ShellExecute不支持定向输出。
  36.   这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
  37.   需要的头文件:windows.hshellapi.h(前者是我试验出来的,后者是msdn说需要的)。另外这两者的先后顺序不能变。
  38.   msdn上说明:[url]http://msdn.microsoft.com/en-us/library/bb762 153[/url](VS.85).aspx
  39.   (三)CreateProcess
  40.   原型如下:
  41.   BOOL CreateProcess(
  42.   LPCTSTR lpApplicationName, //执行程序名
  43.   LPTSTR lpCommandLine, // 参数行
  44.   //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
  45.   LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
  46.   LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
  47.   BOOL bInheritHandles, // 继承标志
  48.   DWORD dwCreationFlags, // 创建标志
  49.   LPVOID lpEnvironment, // 环境变量
  50.   LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
  51.   LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
  52.   LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
  53.   );
  54.   使用方法如下:
  55.   PROCESS_INFORMATION pi;
  56.   STARTUPINFO si;
  57.   memset(&si,,sizeof(si));
  58.   si.cb=sizeof(si);
  59.   si.wShowWindow=SW_SHOW;
  60.   si.dwFlags=STARTF_USESHOWWINDOW;
  61.   bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi);
  62.   这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
  63.   需要的头文件:windows.hwinbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
  64.   msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms682 425[/url](VS.85).aspx
  65.   可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
  66.   关于三个SDK函数: WinExec ShellExecuteCreateProcess 的其他注意事项:
  67.   、定义头文件
  68.   原作者的内容删去。
  69.   这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include "stdafx.h"之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的)
  70.   、定义路径
  71.   C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:
  72.   Disk:\\Directory\\...\\File name
  73.   WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);
  74.   ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL);
  75.   bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi)
  76.   、注意文件的路径
  77.   在程序a调用程序b的时候,b原来的默认的当前路径都会变成a的当前路径。所以,一定要注意。
  78.   可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。
  79.   VC++6.0
  80.   Win95
  81.   如何在VC++中调用外部的DOS程序?它的函数是什么?如果用API,它的函数是什么?
  82.   回答:
  83.   你可以使用Windows API函数WinExecShellExecute。这两个函数可以调用WindowsDOS程序。WinExec主要运行EXE文件。如:
  84.   WinExec("Notepad.exe Readme.txt", SW_SHOW);
  85.   ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。如:
  86.   ShellExecute(, "open", "http://askpro.yeah.net", NULL, NULL, );
  87.   另外,参考QA000583 "外调一个DOS程序,但是又不想显示其产生的窗口"
  88.   Vc 5.0
  89.   Windows
  90.   我正在编写一个程序,想外调一个现成的Com,但是又不想显示其产生的窗口,我试过可以关闭该窗口,一样能运行,可是在我的程序中如何获取该窗口句柄,如何自动关闭它?(飞飞)
  91.   其实使用ShellExecute调用DOS程序时可以不显示窗口,如:
  92.   ShellExecute(, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);
  93.   对于你的问题,你可以使用FindWindow获得句柄,但关掉窗口就不能再继续执行了。而你说的关闭窗口还能执行,大概是因为在你关闭窗口时已经运行结束了。
  94.   #include "stdafx.h"
  95.   #include
  96.   #include //ShellExecute 要引用的库
  97.   int main(int argc, _TCHAR* argv[])
  98.   {
  99.   ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW);
  100.   getchar();
  101.   return ;
  102.   }
  103.   #include "stdafx.h"
  104.   #include
  105.   #include
  106.   #include
  107.   DWORD WINAPI ThreadWork(LPVOID num)
  108.   {
  109.   printf("%d\n",num);
  110.   return ;
  111.   }
  112.   int _tmain(int argc, _TCHAR* argv[])
  113.   {
  114.   DWORD dwThreadID[];
  115.   HANDLE threadhandle=CreateThread(NULL,
  116.   ,
  117.   ThreadWork,
  118.   (LPVOID),//传递的参数
  119.   ,
  120.   &dwThreadID[]);
  121.   getchar();
  122.   return ;
  123.   }

http://blog.csdn.net/samdy1990/article/details/16919969

目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了《vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess》,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题)。 
  三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。 
  WinExec 两个参数,前一个指定路径,后一个指定显示方式。 
  ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。 
  CreateProcess  一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。  
  三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:  
  (一)WinExec  
  这个函数最简单,只有两个参数,原型如下:  
  UINT WinExec(  
  LPCSTR lpCmdLine,   // 命令路径  
  UINT uCmdShow      // 显示方式  
  );  
  使用方法如下:  
  WinExec("Notepad.exe", SW_SHOW);  // 打开记事本  
  WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe  
  需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。 
  这个函数只能打开exe文件。  
  需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。 
  msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms687 393[/url](VS.85).aspx  
  (二)ShellExecute  
  原型如下:  
  HINSTANCE ShellExecute(  
  HWND hwnd,           //父窗口句柄  
  LPCTSTR lpOperation,   //操作, 打开方式 "edit","explore","open","find","print","NULL"  
  LPCTSTR lpFile,         //文件名,前面可加路径  
  LPCTSTR lpParameters,   //参数  
  LPCTSTR lpDirectory,    //默认文件夹  
  INT nShowCmd          //显示方式  
  );  
  使用方法如下:  
  ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL); // 打开C:\Test.txt 文件  
  ShellExecute(NULL, "open", "http://www.google.com/",  NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com  
  ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:\C++  
  ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL , SW_HIDE); // 打印文件C:\Test.txt  
  ShellExecute不支持定向输出。 
  这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。 
  需要的头文件:windows.h,shellapi.h(前者是我试验出来的,后者是msdn说需要的)。另外这两者的先后顺序不能变。 
  msdn上说明:[url]http://msdn.microsoft.com/en-us/library/bb762 153[/url](VS.85).aspx  
  (三)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 //用于在进程创建后接受相关信息  
  );  
  使用方法如下:  
  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:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi); 
  这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。 
  需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。 
  msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms682 425[/url](VS.85).aspx 
  可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!  
  关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:  
  1、定义头文件  
  原作者的内容删去。 
  这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include "stdafx.h"之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的) 
  2、定义路径  
  C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:  
  Disk:\\Directory\\...\\File name  
  WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);  
  ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL);  
  bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi) 
  3、注意文件的路径 
  在程序a调用程序b的时候,b原来的默认的当前路径都会变成a的当前路径。所以,一定要注意。 
  可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。 
  VC++6.0  
  Win95  
  如何在VC++中调用外部的DOS程序?它的函数是什么?如果用API,它的函数是什么?  
  回答:  
  你可以使用Windows API函数WinExec、ShellExecute。这两个函数可以调用Windows和DOS程序。WinExec主要运行EXE文件。如:  
  WinExec("Notepad.exe Readme.txt", SW_SHOW);  
  ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。如:  
  ShellExecute(0, "open", "http://askpro.yeah.net", NULL, NULL, 0);  
  另外,参考QA000583 "外调一个DOS程序,但是又不想显示其产生的窗口"。  
  Vc 5.0  
  Windows 95  
  我正在编写一个程序,想外调一个现成的Com,但是又不想显示其产生的窗口,我试过可以关闭该窗口,一样能运行,可是在我的程序中如何获取该窗口句柄,如何自动关闭它?(飞飞)   
  其实使用ShellExecute调用DOS程序时可以不显示窗口,如:  
  ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);  
  对于你的问题,你可以使用FindWindow获得句柄,但关掉窗口就不能再继续执行了。而你说的关闭窗口还能执行,大概是因为在你关闭窗口时已经运行结束了。   
  #include "stdafx.h" 
  #include  
  #include //ShellExecute 要引用的库 
  int main(int argc, _TCHAR* argv[]) 
  {     
  ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW); 
  getchar(); 
  return 0; 
  } 
  #include "stdafx.h" 
  #include   
  #include   
  #include  
  DWORD WINAPI ThreadWork(LPVOID num) 
  { 
  printf("%d\n",num); 
  return 0; 
  } 
  int _tmain(int argc, _TCHAR* argv[]) 
  { 
  DWORD dwThreadID[5];  
  HANDLE threadhandle=CreateThread(NULL, 
  0, 
  ThreadWork, 
  (LPVOID)2,//传递的参数 
  0, 
  &dwThreadID[0]); 
  getchar();  
  return 0; 
  }

MFC 打开外部EXE文件的三种方法的更多相关文章

  1. VC中加载LIB库文件的三种方法

    VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中   在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...

  2. VC6.0加载lib文件的三种方法

    MFC编写程序,都要用到动态链接库,MFC相关的动态库有MFCD42和MFC42等,MFC框架程序已经自动加载,那么如何引入第三方的动态链接库到工程中呢? 静态链接库是要先把程序中所需要使用的函数编译 ...

  3. Qt 添加外部库文件(四种方法)

    Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...

  4. java将doc文件转换为pdf文件的三种方法

    http://feifei.im/archives/93 —————————————————————————————————————————————— 项目要用到doc转pdf的功能,一番google ...

  5. Node.js写文件的三种方法

    Node.js写文件的三种方式: 1.通过管道流写文件 采用管道传输二进制流,可以实现自动管理流,可写流不必当心可读流流的过快而崩溃,适合大小文件传输(推荐) var readStream = fs. ...

  6. Logstash处理json格式日志文件的三种方法

    假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JS ...

  7. Python实现下载文件的三种方法

    下面来看看三种方法是如何来下载zip文件的:方法一: import urllib print "downloading with urllib" url = 'http://www ...

  8. Viewing the interface of your Swift code,查看Swift代码的头文件的三种方法

      Technical Q&A QA1914 Viewing the interface of your Swift code Q:  How do I view the interface ...

  9. python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

随机推荐

  1. Android实现网易新闻客户端效果

    下面来简单实现一下网易新闻客户端左右切换的效果,当然实际项目上肯定不能这样写,还有很多需要优化的地方. activity_main.xml [html] view plaincopyprint? &l ...

  2. Android代码混淆及项目发布方法记录

     Android代码混淆及项目发布步骤记录 本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. Android代码混淆及项目发布步骤记录 一.清理 ...

  3. Ubuntu下安装为知笔记

    之前在Windows下用的是有道云笔记,但是后来开始习惯使用Linux开发,有道云官方并没有提供Ubuntu的版本,所以权衡之下,选择了为知笔记,安装步骤: sudo add-apt-reposito ...

  4. 关于file.writelines换行符的添加

    和file.readlines/readline不同,file.writelines(l)如果l元素没有换行符,writelines是不会自动加入换行符的,需要我们自己添加,就像这样. import ...

  5. SVN客户端与服务器端搭建操作

    一.客户端的安装 1.点击安装程序 2.修改svn安装位置 3.开始安装 4.客户端安装成功 5.回到左面  右键出现svn检出 tortoiSVN  表示安装成功 Myeclipse svn插件安装 ...

  6. matlab中求逆矩阵的高斯消元法实现的代码

    function qiuni =INV_GET(a)N=length(a);M=eye(N);%得到上三角矩?for i=1:N max=a(i,i); A=i; for j=i+1:N if(abs ...

  7. SPOJ1812 Longest Common Substring II

    题意 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is th ...

  8. BZOJ4260,LOJ10051 Nikitosh 和异或

    题意 给定一个含 \(N\) 个元素的数组 \(A\),下标从 \(1\) 开始.请找出下面式子的最大值:\((A[l_1]\bigoplus A[l_1+1]\bigoplus -\bigoplus ...

  9. 序列化 SqlAlchemy 的结果为 json 字符串

    http://my.oschina.net/gongshang/blog/395431?p=1 在设计 RESTful 的网站时,我们总是希望 ORM 框架返回的结果是可以直接给 View 层使用的 ...

  10. MDK中STM32使用Printf函数详细解析【转载】

    在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...