C++执⾏外部程序(调⽤外部exe程序)参考⼀:
1.使⽤system函数
system("参数1参数2 参数3...)
chars[300];
char*filename = "*****";
sprintf_s(s,"%s %s %s %s","....**.exe", "aa", "bb",filename);
system(s);
system 的⼀般格式为:system(" meta");
缺陷:会出现命令⾏窗⼝。
2.使⽤execl或execv函数
3.使⽤WinExec函数
winexec('C:\WINNT\',0)参数1:.exe⽂件全路径名参数2:控制参数
4.使⽤CreateProcess函数
BOOLCreateProcess(
LPCTSTRlpApplicationName,
LPTSTRlpCommandLine,
LPSECURITY_ATTRIBUTESlpProcessAttributes,
LPSECURITY_ATTRIBUTESlpThreadAttributes,
BOOLbInheritHandles,
DWORDdwCreationFlags,
LPVOIDlpEnvironment,
LPCTSTRlpCurrentDirectory,
LPSTARTUPINFOlpStartupInfo,(welcomebbs)
LPPROCESS_INFORMATIONlpProcessInformation
);
5.使⽤ShellExecute\ShellExecuteEx函数
HINSTANCEShellExecute(HWND hwnd,
LPCTSTRlpOperation,
LPCTSTRlpFile,
LPCTSTRlpParameters,
LPCTSTRlpDirectory,
INTnShowCmd
);
:
:ShellExecute(NULL,"open",pszPName, "参数1参数2 参数3", NULL, SW_SHOW);
SHELLEXECUTEINFOShExecInfo= {0};
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd=NULL;
ShExecInfo.lpVerb=_T("open");
ShExecInfo.lpFile =_T("");
ShExecInfo.lpParameters= _T("-ftrain");
ShExecInfo.lpDirectory= NULL;ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp=NULL;
ShellExecuteEx(&ShExecInfo);
WaitCursorBegin();
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
WaitCursorEnd();
6.System.Diagnostics.Processproc
System.Diagnostics.Processproc = newSystem.Diagnostics.Process(); //程序名称
proc.StartInfo.FileName=""; //参数
proc.StartInfo.Arguments= "/p1 /b38400/fstock /mr"; //隐藏
proc.StartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden; //执⾏
proc.Start();
system函数和execl、execv函数不能控制程序窗⼝是否显⽰,我要的效果是不显⽰该exe程序的窗⼝,所以这两种⽅法不予考虑。WinExec 函数不好控制主程序来等该exe程序的结束,所以放弃。CreateProcess函数是新建⼀个进程,所以,你必须⼈为地控制该进程的⽣死,不如ShellExecuteEx⽅
便。ShellExecute可以指定⼯作⽬录,并且还可以寻⽂件的关联直接打开不⽤加载与⽂件关联的应⽤程序,ShellExecute 还可以打开⽹页,启动相应的邮件关联发送邮件等等。
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++中所表⽰的路径要⽤" \\ "⽽不是平常所⽤的"\ ",所以以上三个函数表⽰路径都为:
boolfRet=CreateProcess("D:\\",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,π);
参考⼆:
本⽂只做简单介绍,具体⽤法请参照MSDN。
C中的函数:
<() 函数家族:
exec() 家族的函数将会创建⼀个新的进程来执⾏程序。(不能设置权限,只是单纯的传值执⾏exe)
_execl, _wexecl
_execv, _wexecv
_execle, _wexecle
_execve, _wexecve
_execlp, _wexeclp
_execvp, _wexecvp
_execlpe, _wexeclpe
_execvpe, _wexecvpe
具体使⽤例⼦msdn:ms-help://MS.MSDNQTR.v90.chs/dv_vccrt/html/a261df93-206a-4fdc-b8ac-66aa7db83bc6.htm
2.spawn()函数家族:
spawn() 家族的函数将会创建⼀个新的进程来执⾏程序。(不能设置权限,只是单纯的传值执⾏exe)
createprocessa_spawnl, _wspawnl
_spawnv, _wspawnv
_spawnle, _wspawnle
_spawnve, _wspawnve
_spawnlp, _wspawnlp
_spawnvp, _wspawnvp
_spawnlpe, _wspawnlpe
_spawnvpe, _wspawnvpe
具体使⽤例⼦msdn:ms-help://MS.MSDNQTR.v90.chs/dv_vccrt/html/bb47c703-5216-4e09-8023-8cf25bbf2cf9.htm
3.system()函数
可⽤于执⾏控制台命令(DOS命令),⽐如
system("cls");//清屏,等于在DOS上使⽤cls命令
WIN32 API
1.WinExec()函数
只提供16位windows程序使⽤。(不能设置权限,只是单纯的传值执⾏exe)
⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);
⑵ 参数:
lpCmdLine:指向⼀个空结束的字符串,串中包含将要执⾏的应⽤程序的命令⾏(⽂件名加上可选参数)。
uCmdShow:定义Windows应⽤程序的窗⼝如何显⽰,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。
⑶ 返回值:
若函数调⽤成功,则返回值⼤于31。若函数调⽤失败,则返回值为下列之⼀:
① 0:系统内存或资源已耗尽。
② ERROR_BAD_FORMAT:EXE⽂件⽆效(⾮Win32.EXE或.EXE影像错误)。
③ ERROR_FILE_NOT_FOUND:指定的⽂件未到。
④ ERROR_PATH_NOT_FOUND:指定的路径未到。
虽然Microsoft认为WinExec已过时,但是在许多时候,简单的WinExec函数仍是运⾏新程序的最好⽅式。简单地传送作为第⼀个参数的命令⾏,还需要决定如何显⽰程序(该程序也许会忽视它)的第⼆
个参数。通常,将其设置为SW_SHOW,也可尝试SW_MINIMIZED或 SW_MAXIMIZED。WinExec不允许⽤CreateProcess获得的所有选项,⽽它的确简单。
2.ShellExecute()函数
ShellExecute不仅可以运⾏EXE⽂件,也可以运⾏已经关联的⽂件。
⑴标准⽤法
ShellExecute函数原型及参数含义如下:
HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
●hWnd:⽤于指定⽗窗⼝句柄。当函数调⽤过程出现错误时,它将作为Windows消息窗⼝的⽗窗⼝。例如,可以将其设置为应⽤程序主窗⼝句柄,即Application.Handle,也可以将其设置为桌⾯窗⼝句柄(⽤GetDesktopWindow函数获得)。
●lpOperation:⽤于指定要进⾏的操作。其中“open”操作表⽰执⾏由FileName参数指定的程序,或打开由FileName参数指定的⽂件或⽂件夹;“print”操作表⽰打印由FileName参数指定的⽂件;“explore”
操作表⽰浏览由FileName参数指定的⽂件夹。当参数设为nil时,表⽰执⾏默认操作“open”。
●lpFileName:⽤于指定要打开的⽂件名、要执⾏的程序⽂件名或要浏览的⽂件夹名。
●lpParameters:若FileName参数是⼀个可执⾏程序,则此参数指定命令⾏参数,否则此参数应为nil或PChar(0)。
●lpDirectory:⽤于指定默认⽬录。
●lpShowCmd:若FileName参数是⼀个可执⾏程序,则此参数指定程序窗⼝的初始显⽰⽅式,否则此参数应设置为0。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>
int main( void )
{
HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "d:\\tese.log", NULL, NULL, SW_SHOW);
if ((DWORD)hNewExe <= 32)
{
printf("return value:%d\n", (DWORD)hNewExe);
}
else
{
printf("successed!\n");
}
printf("GetLastError: %d\n", GetLastError());
system("pause");
return 1;
}
当“D:\\test.log”⽂件不存在是,执⾏结果如下:
这⾥若函数执⾏错误, GetLastError()不⼀定能捕获到错误代码,例如当“d:\\tese.log”⽂件存在,将记事本""命名为其他名字时: 另外两个函数的返回值就不列出了。
(2) 特殊⽤法
例⼦(delphi):
在⼀个应⽤程序调⽤;
ShellExecute(handle, ’open’,’’,’字串内容’,nil, SW_SHOWNORMAL);
在⾥可以调⽤:
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1to paramcount do
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));
end;
最后的那个参数,为窗⼝指定可视性⽅⾯的⼀个命令。请⽤下述任何⼀个常数
SW_HIDE 隐藏窗⼝,活动状态给令⼀个窗⼝
SW_MINIMIZE 最⼩化窗⼝,活动状态给令⼀个窗⼝
SW_RESTORE ⽤原来的⼤⼩和位置显⽰⼀个窗⼝,同时令其进⼊活动状态
SW_SHOW ⽤当前的⼤⼩和位置显⽰⼀个窗⼝,同时令其进⼊活动状态
SW_SHOWMAXIMIZED 最⼤化窗⼝,并将其激活
SW_SHOWMINIMIZED 最⼩化窗⼝,并将其激活
SW_SHOWMINNOACTIVE 最⼩化⼀个窗⼝,同时不改变活动窗⼝
SW_SHOWNA ⽤当前的⼤⼩和位置显⽰⼀个窗⼝,不改变活动窗⼝
SW_SHOWNOACTIVATE ⽤最近的⼤⼩和位置显⽰⼀个窗⼝,同时不改变活动窗⼝
SW_SHOWNORMAL 与SW_RESTORE相同
3、深⼊浅出ShellExecute 译者:徐景周(原作:Nishant S)
Q: 如何打开⼀个应⽤程序? 正如您所看到的,我并没有传递程序的完整路径。
ShellExecute(this->m_hWnd, "open", "", "", "", SW_SHOW);
或ShellExecute(this->m_hWnd, "open", "", "c:\\MyLog.log", "", SW_SHOW);
Q: 如何打开⼀个同系统程序相关连的⽂档?
ShellExecute(this->m_hWnd, "open", "c:\\", "", "", SW_SHOW);
Q: 如何打开⼀个⽹页?
ShellExecute(this->m_hWnd, "open", "le", "", "", SW_SHOW);
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this->m_hWnd,"open", "mailto:nishinapp@yahoo","","", SW_SHOW ); Q: 如何⽤系统打印机打印⽂档?
ShellExecute(this->m_hWnd, "print", "c:\\", "", "", SW_HIDE);
Q: 如何⽤系统查功能来查指定⽂件?
ShellExecute(m_hWnd, "find", "d:\\nish", NULL, NULL, SW_SHOW);
Q: 如何启动⼀个程序,直到它运⾏结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论