當項目比較大的時候,通常會分開來開發,如果分開的部分只是一些函數或類,整合的時候 就可以使用靜態庫或動態庫。但如果分開的是一個exe文件,整合的時候,就要通過調用exe文件來使用。尤其是當第三方軟件是一個用C語言編寫的exe文件時,更是需要如此。
最近在我所開發的LCDS系統當中就碰到了這樣的問題。他需要調用一個分類器來處理數據,而手頭上的分類器是經典的C4.5決策樹分類器,它是用c語言寫的,沒有.h頭文件,生成的是一個exe文件,通過在命令行執行main函數來處理數據。如果想把其改成靜態庫或動態庫,因為沒有頭文件,改寫后似乎不好調用其函數,因此考慮直接調用其生成的exe文件。可考慮的方法有:
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();