天天看點

C/C++中一次性執行多個DOS指令

最近給公司的一個系統寫了個啟動的腳本,但是上司說批處理這樣的腳本太low了,要使用EXE來啟動,未來還要使用加密工具對EXE進行加密。

好吧,我就在網上到處找bat轉exe的工具,找了很久,都沒有找到合适的,隻有一個用winrar制作自解壓包的方法還算可以,但是這玩意兒有兩個坑爹的問題:

使用了自定義圖示後,安裝時會被360報告有木馬;

用winrar制作的exe,其本質還是解壓後執行,解壓後的檔案其實可以在系統臨時目錄下找到,是以以後想要加密其實很容易就會被破解;

是以最好的辦法看來就是自己寫一個exe了,考慮到我以前用過C,是以下載下傳了Dev-Cpp這個工具來編寫代碼。

在C語言中執行DOS指令的方法很多,如:ShellExecute, WinExec, CreateProcess等,但是這些接口都是隻能一次執行一條指令,在我的啟動腳本裡有很多指令,有一些是設定環境變量的,這樣就沒法在代碼中一條條執行腳本中的指令,必須要找到一個辦法可以一次性執行多條指令。

在網上找了很久,最終确定使用CreateProcess,同時要使用管道技術。也就是使用CreateProcess建立一個cmd程序,然後通過輸入管道将待執行的指令傳遞給cmd程序,通過輸出管道擷取cmd程序的輸出資訊,因為是通過管道進行,是以可以模拟在DOS視窗一行行輸入指令,進而實作執行多條DOS指令了。

從MSDN上找到管道的示例代碼,簡單修改了一下。

首先,将CreateProcess的參數改為啟動cmd:

然後,将原來批處理裡面的腳本複制一下,放到一個變量裡(這裡我改了一下,沒有用我實際的腳本,因為那個不通用,不适合做例子),注意,每一行最後要加上回車符\n,這樣才能正确模拟DOS視窗中輸入指令的情況:

再然後,原來的示例代碼中是把批處理檔案作為EXE的參數傳遞進來的,既然上面改為将批處理檔案内容放到腳本裡,代碼中從檔案中讀取指令的那部分就要去掉了,這部分代碼就不多說了。

完整的示例代碼如下:

執行效果如下圖:

C/C++中一次性執行多個DOS指令

main.exe的原始目錄是D:\Workspace\research\C\Chrome\,執行時,首先執行了cd..,退到上一層目錄,然後執行dir,顯示上一層目錄的内容,證明上面的代碼确實可以一次執行多條DOS指令。

本文轉自 tywali 51CTO部落格,原文連結:http://blog.51cto.com/lancelot/2046167,如需轉載請自行聯系原作者

繼續閱讀