C++程序中调用exe可执行文件

转载 2013年12月27日 14:59:48

[本文整理自:http://blog.csdn.net/moyumoyu/article/details/6767621]

更详细的参考在vc中怎么调用exe文件并传递参数


当项目比较大的时候,通常会分开来开发,如果分开的部分只是一些函数或类,整合的时候 就可以使用静态库或动态库。但如果分开的是一个exe文件,整合的时候,就要通过调用exe文件来使用。尤其是当第三方软件是一个用c语言编写的exe文件时,更是需要如此。 

最近在我所开发的LCDS系统当中就碰到了这样的问题。他需要调用一个分类器来处理数据,而手头上的分类器是经典的C4.5决策树分类器,它是用c语言写的,没有.h头文件,生成的是一个exe文件,通过在命令行执行main函数来处理数据。如果想把其改成静态库或动态库,因为没有头文件,改写后似乎不好调用其函数,因此考虑直接调用其生成的exe文件。可考虑的方法有:

      1.使用system函数      可以参考 【在vc6控制台程序中如何调用运行ImageMagick命令行工具
      2.使用execl或execv函数         
      3.使用WinExec函数     
      4.使用CreateProcess函数 
      5.使用ShellExecuteEx函数 
      system函数和execl、execv函数不能控制程序窗口是否显示,我要的效果是不显示该exe程序的窗口,所以这两种方法不予考虑。WinExec函数不好控制主程序来等该exe程序的结束,所以放弃。CreateProcess函数是新建一个进程,所以,你必须人为地控制该进程的生死,不如ShellExecuteEx方便,所以最终我选择的是ShellExecuteEx函数。
      程序如下: 
SHELLEXECUTEINFO ShExecInfo = {0}; 
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
ShExecInfo.hwnd = NULL; 
ShExecInfo.lpVerb = _T("open"); 
ShExecInfo.lpFile = _T("c4.5.exe"); 
ShExecInfo.lpParameters = _T("-f train"); 
ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE; 
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo); 
WaitCursorBegin(); 
WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 
WaitCursorEnd(); 
比如c:\notpad.exe 可以这么写(比如按钮按下) winexec('c:\notpad.exe',1); 这样就行了
(3)ShellExecute()也行
(4)winexec('C:\WINNT\system32\notepad.exe',0)  参数1:.exe文件全路径名 参数2: 控制参数 

5.关于在VC中调用其它EXE

      三个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 等等,就不会出现正常的窗体,但是已经被加到任务列表里了。 

  • 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", "iexplore.exe","http://www.welcomebbs.com",/ NULL, NULL, SW_SHOWNORMAL); // 打开网页www.welcomebbs.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不支持定向输出。 

  •  CreateProcess (welcomebbs)原型如下: 

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,π);

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

关于三个SDK函数: WinExec, ShellExecute,CreateProcess(welcomebbs)的注意 

  1. 定义头文件 在头文件stdafx.h中必须定义以下两个头文件: 

    #include <shlobj.h> // 可替换为 windows.h 
    #include <shellapi.h> 如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.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

C/C++执行外部程序(调用外部exe程序)

本文只做简单介绍,具体用法请参照MSDN。 C中的函数: 1.exec() 函数家族: exec() 家族的函数将会创建一个新的进程来执行程序。(不能设置权限,只是单纯的传值执行exe) _exec...
  • dongpanshan
  • dongpanshan
  • 2012年08月06日 16:20
  • 36747

C/C++项目调用外部exe程序方法

前言在开发项目的时候,有的时候需要调用外部exe文件。那么在C/C++里面直接调用exe文件的方法有哪些呢?现在可考虑的方法主要有: 使用system函数 使用exec或者是execv函数 使用Win...
  • youmingyu
  • youmingyu
  • 2016年12月05日 22:28
  • 894

C++执行外部程序(调用外部exe程序)

参考一: 1.使用system函数 system("xxx.exe参数1参数2 参数3...) chars[300]; char*filename = "*****"; ...
  • zhu2695
  • zhu2695
  • 2013年09月28日 16:25
  • 14936

C++获取当前可执行程序(*.exe)所在的路径

我们在写程序时经常有这样一种应用的需求:在exe可执行文件所在的目录下进行一些与该程序相关的文件存储操作。当程序运行时就修要知道可执行程序安装在当前用户系统中的那个目录下。主要就是利用GetModul...
  • educast
  • educast
  • 2013年02月17日 20:12
  • 14703

C/C++执行外部程序(调用外部exe程序)

C中的函数: 1.exec() 函数家族: exec() 家族的函数将会创建一个新的进程来执行程序。(不能设置权限,只是单纯的传值执行exe) _execl, _wexecl _execv, _wex...
  • u011164819
  • u011164819
  • 2016年12月02日 10:53
  • 2737

c++ 启动exe(外部程序)

关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项: 【1】定义头文件 必须定义以下两个头文件: #include  // 可替...
  • Nancy_m
  • Nancy_m
  • 2013年03月06日 20:47
  • 28998

C++ 调用命令行exe带参数程序

转载网址:http://blog.sina.com.cn/s/blog_76e94d210100vdj8.html a.使用system函数 若用到很多参数,一般采用如下方法: char...
  • shuaiby
  • shuaiby
  • 2013年05月26日 18:21
  • 2231

C++调用exe文件

  • 2012年12月09日 18:13
  • 8.82MB
  • 下载

C++程序中调用exe可执行文件

C++程序中调用exe可执行文件 在开发项目的时候,有的时候会分开来开发,分开的有时是exe文件,有的时候也会调用现成的工具包里面的一些exe文件,这样在项目里面就要通过调用exe文...
  • DDFFR
  • DDFFR
  • 2016年10月22日 22:27
  • 1260

C++调用exe文件

程序:STARTUPINFO si; memset(&si,0,sizeof(STARTUPINFO));//初始化si在内存块中的值(详见memset函数) si.cb=sizeof...
  • hong__fang
  • hong__fang
  • 2015年05月24日 22:06
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++程序中调用exe可执行文件
举报原因:
原因补充:

(最多只允许输入30个字)