當項目比較大的時候,通常會分開來開發,如果分開的部分只是一些函數或類,整合的時候 就可以使用靜態庫或動態庫。但如果分開的是一個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();