(轉)c++--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("-f train");              
 ShExecInfo.lpDirectory  =  NULL;  
 ShExecInfo.nShow  =  SW_HIDE;  
 ShExecInfo.hInstApp  =  NULL;              
 ShellExecuteEx(&ShExecInfo); 
 WaitCursorBegin();
 WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
 WaitCursorEnd();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM