C++程式怎樣呼叫exe可執行檔案

Mr_John_Liang發表於2013-05-07

在開發專案的時候,有的時候會分開來開發,分開的有時是exe檔案,有的時候也會呼叫現成的工具包裡面的一些exe檔案,這樣在專案裡面就要通過呼叫exe檔案來使用。

那麼在C++裡面直接呼叫exe檔案的方法有哪些呢?現在可考慮的方法主要有:

a.使用system函式

b.使用exec或者是execv函式

c.使用WinExec函式

d.使用CreateProcess函式

e.使用ShellExcecuteEx函式

 

1) 上面的5中方法中,system函式,函式原型system(執行shell命令)定義函式是,int system(const char * string),可以呼叫一些DOS命令,比如:

system("cls");//清屏,等於在DOS上使用cls命令

system函式會呼叫fork()函式產生子進行橫,由子程式來呼叫/bin/sh-c string來執行引數string字串所代表的命令,此命令執行完後隨即返回撥用的程式,system函式不能控制程式視窗是否顯示。一般在專案中,這種方法不予考慮。

 

2)使用execl或execv函式

   這是exec函式族裡面的兩個函式,在UNIX環境下用的比較多,exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程式的內容,也就是說在呼叫程式內部執行一個可執行檔案,這裡的可執行檔案既可以是二進位制檔案,也可以是任何Linux下的可執行的指令碼檔案,與一般情況不同,exec函式族的函式執行成功後不會返回,只有呼叫失敗了才會返回一個-1,從原程式的呼叫點接著往下執行。它也是不能控制程式視窗是否顯示。

 

3)使用WinExec函式

WinExec函式可以方便地在應用程式中執行一個程式,執行一個標準程式一般使用:

WinExec('C:\WINDOWS\NOTEPAD.EXE', SW_SHOWNORMAL);

第二個引數是控制程式主視窗的顯示方式,用WinExec只能執行exe檔案,但是WinExec函式不好控制主程式來等該exe程式的結束。WinExec是Windows的老函式了,現在的CreateProcess幾乎可以替代WinExe的所有功能。

 

4)使用CreateProcess函式

CreateProcess函式是新建一個程式,下面是一個使用CreateProcess函式的例子:

void createchildprocessandwaituntildone(const ansistring& strcmdline)
{

process_information piprocinfo;
startupinfo sistartinfo;

// set up members of startupinfo structure.
sistartinfo.cb = sizeof(startupinfo);
sistartinfo.lpreserved = null;
sistartinfo.lpreserved2 = null;
sistartinfo.cbreserved2 = 0;
sistartinfo.lpdesktop = null;
sistartinfo.dwflags = 0;


// create the child process.
createprocess(

null,
strcmdline.c_str(),
null, // process security attributes
null, // primary thread security attributes
0, // handles are inherited
0, // creation flags
null, // use parent\'s environment
null, // use parent\'s current directory
&sistartinfo, // startupinfo pointer
&piprocinfo); // receives process_information

// wait for the processs to finish
dword rc = waitforsingleobject(
piprocinfo.hprocess, // process handle
infinite);
}

使用CreateProcess函式,你必須人為地控制該程式的生死,這一方面是使用程式控制來實現。程式控制的意義在於可以建立一個程式,並且可以通過程式控制程式碼結束程式。

 

5)使用ShellExcecuteEx函式

這個函式主要是在檔案上執行一個函式,如果執行成功則返回一個非0值,否則返回一個0值。函式的原型是:

WINSHELLAPI BOOL WINAPI ShellExecuteEx(
    LPSHELLEXECUTEINFO lpExecInfo);

引數lpExecInfo:是資料結構 LPSHELLEXECUTEINFO 的地址,包含了和接收一些被執行的應用程式的一些資訊。下面是一個使用的示例:

SHELLEXECUTEINFO  ShExecInfo  =  {0}; 
 ShExecInfo.cbSize  =  sizeof(SHELLEXECUTEINFO); 
 ShExecInfo.fMask  =  SEE_MASK_NOCLOSEPROCESS; 
 ShExecInfo.hwnd  =  NULL; 
 ShExecInfo.lpVerb  =  _T("open"); 
 ShExecInfo.lpFile  =  _T("a.exe");                         
 ShExecInfo.lpParameters  =  _T("-a a");             
 ShExecInfo.lpDirectory  =  NULL; 
 ShExecInfo.nShow  =  SW_HIDE; 
 ShExecInfo.hInstApp  =  NULL;             
 ShellExecuteEx(&ShExecInfo);
 WaitCursorBegin();
 WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
 WaitCursorEnd();

這個函式可以通過ShExecInfo.lpParameters來傳遞exe檔案的引數,通過屬性ShExecInfo.nShow來控制程式視窗是否顯示。

 

後面三個函式都是SDK函式,現在在執行專案中的exe檔案的時候,使用比較多的就是後面得兩個函式,我在自己的專案中使用的就是ShellExecuteEx函式,比CreateProcess函式使用方便一些。

相關文章