C++调用其他EXE文件.docx

上传人:b****7 文档编号:10407392 上传时间:2023-02-11 格式:DOCX 页数:14 大小:22.56KB
下载 相关 举报
C++调用其他EXE文件.docx_第1页
第1页 / 共14页
C++调用其他EXE文件.docx_第2页
第2页 / 共14页
C++调用其他EXE文件.docx_第3页
第3页 / 共14页
C++调用其他EXE文件.docx_第4页
第4页 / 共14页
C++调用其他EXE文件.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C++调用其他EXE文件.docx

《C++调用其他EXE文件.docx》由会员分享,可在线阅读,更多相关《C++调用其他EXE文件.docx(14页珍藏版)》请在冰豆网上搜索。

C++调用其他EXE文件.docx

C++调用其他EXE文件

在c++中调用*.exe可执行程序的方法  

怎样加载其他的应用程序?

三个SDK函数winexec,shellexecute,createprocess可以使用。

WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如用SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。

ShellExecute较WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开c:

\temp\1.txt,而不用加载与txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示ReadmeorFaq,我猜就是这么作的啦.ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:

\\temp"),SW_SHOWMAXMIZED)CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:

   STARTUPINFO  stinfo  

 //启动窗口的信息  

   PROCESSINFO  procinfo  //进程的信息  

   CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,   

NORMAL_PRIORITY_  

   CLASS,NULL,NULL,  &stinfo,&procinfo)    

常用举例:

1、函数:

system("C:

\ProgramFiles\WindowsNT\hypertrm.exe");

2、调用EXE文件有个比较简单的方法就是这样WinExec("c:

\\windows\\system32\\cmd.exe",1);

3、调用打开EXE文件的方法最方便的就是使用ShellExecute函数,

格式就是一楼所提到的那样,为你exe文件所在路径,例如:

"X:

\\XXX\\XXX.exe",另外该函数还能打开ie网页和其他各种类型的文件(txt,bmp,jpg,mp3,avi,wmv等等),只要是系统能够识别的都能打开

ShellExecute(handle,"open",,NULL,NULL,SW_SHOWNORMAL);

这个不可思议的函数就是:

ShellExecute,取代了WinExec。

你可以给它任何文件的名字,它都能识别出来并打开它。

例如:

ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);

用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是Microsoft  Paint,  Adobe  Photoshop,  或者  Corel  PhotoPaint。

  有关ShellExecute的详细用法信息自己去参考有关资料吧,重要的是你知道了这个函数能打开任何文件,甚至是桌面和URL快捷方式(  .ink或  .url)。

ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。

然后,ShellExecute  返回打开文件的应用的实例句柄。

  

 更奇妙的是ShellExecute不仅能打开机器上的文件,还能打开Internet的站点地址。

例如:

ShellExecute(NULL,  "open",  "",  NULL,  NULL,  SW_SHOWNORMAL);      

 这个代码使你能访问微软的主页。

当ShellExecute遇到文件名前面的“http:

”时,可以判断出要打开的文件是Web文件,随之启动Internet  Explorer  或者  Netscape  Navigator  或者任何你使用的别的浏览器打开文件。

ShellExecute还能识别其它协议,象FTP、GOPHER。

甚至识别“mailto”,如果文件名指向“mailto:

zxn@”,它启动电子邮件程序并打开一个待编辑的新邮件。

总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。

如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。

ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,它的用法参见有关文档。

  

 现在,你知道了ShellExecute的秘密,用它很容易增加一个链接到你的About对话框。

不是吗。

:

)  

Q&A

Q:

如何打开一个应用程序?

ShellExecute(this->m_hWnd,"open","calc.exe","","",SW_SHOW);或ShellExecute(this->m_hWnd,"open","notepad.exe","c:

\\MyLog.log","",SW_SHOW);正如您所看到的,我并没有传递程序的完整路径。

Q:

如何打开一个同系统程序相关连的文档?

ShellExecute(this->m_hWnd,"open","c:

\\abc.txt","","",SW_SHOW);

Q:

如何打开一个网页?

ShellExecute(this->m_hWnd,"open","","","",SW_SHOW);

Q:

如何激活相关程序,发送EMAIL?

ShellExecute(this->m_hWnd,"open","mailto:

nishinapp@","","",SW_SHOW);

Q:

如何用系统打印机打印文档?

ShellExecute(this->m_hWnd,"print","c:

\\abc.txt","","",SW_HIDE);

Q:

如何用系统查找功能来查找指定文件?

ShellExecute(m_hWnd,"find","d:

\\nish",NULL,NULL,SW_SHOW);

Q:

如何启动一个程序,直到它运行结束?

SHELLEXECUTEINFOShExecInfo={0};

ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);

ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;

ShExecInfo.hwnd=NULL;

ShExecInfo.lpVerb=NULL;

ShExecInfo.lpFile="c:

\\MyProgram.exe";

ShExecInfo.lpParameters="";

ShExecInfo.lpDirectory=NULL;

ShExecInfo.nShow=SW_SHOW;

ShExecInfo.hInstApp=NULL;

ShellExecuteEx(&ShExecInfo);

WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

或:

PROCESS_INFORMATIONProcessInfo;

STARTUPINFOStartupInfo;//Thisisan[in]parameter

ZeroMemory(&StartupInfo,sizeof(StartupInfo));

StartupInfo.cb=sizeofStartupInfo;//Onlycompulsoryfield

if(CreateProcess("c:

\\winnt\\notepad.exe",NULL,

   NULL,NULL,FALSE,0,NULL,

   NULL,&StartupInfo,&ProcessInfo))

{

   WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

   CloseHandle(ProcessInfo.hThread);

   CloseHandle(ProcessInfo.hProcess);

else

{

   MessageBox("Theprocesscouldnotbestarted...");

}

Q:

如何显示文件或文件夹的属性?

SHELLEXECUTEINFOShExecInfo={0};

ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);

ShExecInfo.fMask=SEE_MASK_INVOKEIDLIST;

ShExecInfo.hwnd=NULL;

ShExecInfo.lpVerb="properties";

ShExecInfo.lpFile="c:

\\";//canbeafileaswell

ShExecInfo.lpParameters="";

ShExecInfo.lpDirectory=NULL;

ShExecInfo.nShow=SW_SHOW;

ShExecInfo.hInstApp=NULL;

ShellExecuteEx(&ShExecInfo);

BOOLret=0;

STARTUPINFOinfo;

memset(&info,0,sizeof(info));

info.cb=sizeof(info);

info.dwFlags=STARTF_USESHOWWINDOW;

info.wShowWindow=show_hide;

SW_HIDE;

PROCESS_INFORMATIONpinfo;

pinfo.hProcess=NULL;

pinfo.hThread=NULL;

pinfo.dwProcessId=NULL;

pinfo.dwThreadId=NULL;

ret=CreateProcess(NULL,

szExePath,

NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,

NULL,NULL,&info,&pinfo);

C++调用exe文件

当项目比较大的时候,通常会分开来开发,如果分开的部分只是一些函数或类,整合的时候就可以使用静态库或动态库。

但如果分开的是一个exe文件,整合的时候,就要通过调用exe文件来使用。

尤其是当第三方软件是一个用c语言编写的exe文件时,更是需要如此。

最近在我所开发的LCDS系统当中就碰到了这样的问题。

他需要调用一个分类器来处理数据,而手头上的分类器是经典的C4.5决策树分类器,它是用c语言写的,没有.h头文件,生成的是一个exe文件,通过在命令行执行main函数来处理数据。

如果想把其改成静态库或动态库,因为没有头文件,改写后似乎不好调用其函数,因此考虑直接调用其生成的exe文件。

可考虑的方法有:

1.使用system函数

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("-ftrain");             

 ShExecInfo.lpDirectory = NULL; 

 ShExecInfo.nShow = SW_HIDE; 

 ShExecInfo.hInstApp = NULL;             

 ShellExecuteEx(&ShExecInfo);

 WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//这句很重要,一定要写,是等待这个.exe运行结束后再向下执行,特别是下面的代码依赖于.exe的运行结果时。

ShellExecuteEx的参数在C++中其结构为:

typedefstruct_SHELLEXECUTEINFO{

DWORDcbSize;  // typedefunsignedlongDWORD;

ULONGfMask;

HWNDhwnd;

LPCTSTRlpVerb;

LPCTSTRlpFile;

LPCTSTRlpParameters;

LPCTSTRlpDirectory;

intnShow;

HINSTANCEhInstApp;

LPVOIDlpIDList;

LPCTSTRlpClass;

HKEYhkeyClass;

DWORDdwHotKey;

union{

HANDLEhIcon;

HANDLEhMonitor;

}DUMMYUNIONNAME;

HANDLEhProcess;

}SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO;

参数详解:

cbSize

存储该结构的长度,以字节为单位。

fMask

一个标志数组,用来设置其他成员的有效性

SEE_MASK_CLASSKEY         0x3

SEE_MASK_CLASSNAME         0x1

SEE_MASK_CONNECTNETDRV     0x80

SEE_MASK_DOENVSUBST         0x200

SEE_MASK_FLAG_DDEWAIT     0x100

SEE_MASK_FLAG_LOG_USAGE     0x4000000

SEE_MASK_FLAG_NO_UI         0x400

SEE_MASK_HMONITOR         0x200000

SEE_MASK_HOTKEY         0x20

SEE_MASK_ICON             0x10

SEE_MASK_IDLIST         0x4

SEE_MASK_INVOKEIDLIST     0xC

SEE_MASK_NOASYNC         0x100000

SEE_MASK_NOCLOSEPROCESS     0x40

SEE_MASK_NOZONECHECKS     0x800000

SEE_MASK_NO_CONSOLE         0x8000

SEE_MASK_UNICODE         0x100000

SEE_MASK_FILEANDURL         0x4000000

hwnd

调用这个ShellExecuteEx的窗口句柄

lpVerb

设定这个ShellExecuteEx的动作,包括:

   edit

   打开编辑器编辑文档,如果lpFile不是一个文档,则这个函数会失败

   explore

   以lpFile为路径打开资源管理器

   find

   从指定目录开始搜索

   open

   根据lpFile打开对应文件,该文件可以为可执行文件、文档或者文件夹

   print

   根据lpFile打印文档,若lpFile不是一个文档则该函数会失败 

    properties

   显示文件或文件夹的属性

lpFile

  以\0结尾的字符串,指出lpVerb的操作对象的路径,被系统支持的操作包括文本的open、print等,其中print要求必须有一个已经注册的打印机,而其他种类的文档会通过系统关联进行查询执行。

若要设置一个空的namespace,则需要设置fMask的值为see_mask_invokeidlist。

注意:

若see_mask_invokeidlist已设置,则可以藉由lpFile或者lpIDList确定item的系统路径或者PIDL

lpParameters

运行/打开程序的参数,如果打开的是一个文档,则该项无效

lpDirectory

指明工作目录的名字,成员没有说明,则默认为当前目录

nShow

说明ShellExecuteEx打开的程序将以什么形式出现

hInstApp

如果函数运行成功,该项的值将大于32,否则会是下列错误对应的值

   SE_ERR_FNF 

    没有找到文件

   SE_ERR_PNF

   没有找到路径

   SE_ERR_ACCESSDENIED

   拒绝访问

   SE_ERR_OOM

   内存不足

   SE_ERR_DLLNOTFOUND

   没有找到动态链接库

   SE_ERR_SHARE

   不能操作一个以打开的文件

   SE_ERR_ASSOCINCOMPLETE

   文件关联信息不完整

   SE_ERR_DDETIMEOUT

   DDE操作超时

   SE_ERR_DDEFAIL

   DDE操作失败

   SE_ERR_DDEBUSY

   DDE繁忙

   SE_ERR_NOASSOC

   没有找到文件关联

lpIDList

一个itemidlist结构的地址,用来存储成员的特别标识符,当fMask不包括see_mask_idlistsee_mask_invokeidlist时该项被忽略

lpClass

用以指明文件类别的名字或GUID,当fMask不包括see_mask_classname时该项被忽略

hkeyClass

获得已在系统注册的文件类型的Handle,当fMask不包括see_mask_classkey时该项被忽略

dwHotKey

程序的热键关联,低位存储虚拟关键码(KeyCode),高位存储修改标志位(HOTKEYF_),修改标志(modifier flags)的详细列表请看wm_sethotkey消息的描述,当fmask不包括see_mask_hotkey时该项

被忽略

DUMMYUNIONNAME

hIcon

取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略

hMonitor

将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略

hProcess

用于进行return操作的成员,若fMask不设为see_mask_nocloseprocess则该项值为null,即使fMask设为

see_mask_nocloseprocess,若没有进程启动,该项值仍为null。

即没有新的进程启动,则该项值一只为null

ShellExecuteEx的用法

   关于如何在c++中启动外部的exe程序,之前看到在XX一搜就看到了:

   ShellExecute(this->m_hWnd,"open","calc.exe","","",SW_SHOW);

   经验证果然可以,一条语句直接就启动了。

之后我想在我的代码结束时也把这个exe程序给关闭了,按照网上的做法直接TerminateProcess(HINSTANCE,0)就不行了,参数根本就不能是HINSTANCE类型;然后使用sendMessage(WM_Close,...)也不行,原因应该是我的exe程序根本就没有窗口;最后使用了ShellExecuteEx,总算搞定了。

附上代码:

启动:

SHELLEXECUTEINFOShExecInfo;

ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);

ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;

ShExecInfo.hwnd=NULL;

ShExecInfo.lpVerb=NULL;

ShExecInfo.lpFile="xxx.exe";//canbeafileaswell

ShExecInfo.lpParameters="";

ShExecInfo.lpDirectory=NULL;

ShExecInfo.nShow=SW_SHOW;

ShExecInfo.hInstApp=NULL;

ShellExecuteEx(&ShExecInfo);

关闭:

if(ShExecInfo.hProcess!

=NULL)

{

     TerminateProcess(ShExecInfo.hProcess,0);

     ShExecInfo.hProcess=NULL;

}

WinExec

概述

WinExec

VB声明

注意

该函数只提供对16位机子的兼容。

应用程序应该使用CreateProcess函数。

DeclareFunctionWinExecLib"kernel32"Alias"WinExec"(ByVallpCmdLineAsString,ByValnCmdShowAsLong)AsLong

说明

运行指定的程序

返回值

Long,大于32表示成功,请参考FindExecutable函数

参数表

参数类型及说明

lpCmdLineString,包含要执行的命令行

nCmdShowLong,定义了以怎样的形式启动程序的常数值。

参考ShowWindow函数的nCmdShow参数

注解

请参考对CreateProcess函数的说明,了解在目录中查找指定文件的顺序

VC中如何使用

WINSHELLAPIvoidWINAPIWinExecErrorA(HWNDhwnd,interror,L

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1