2009-10-20 60 views
12

我在Dev-C++中編寫了一個C程序,我需要使用幾個Windows(CMD)命令。這很容易,但是當執行system()函數中的命令時,程序會在執行過程中運行控制檯。在C系統()函數中隱藏控制檯Win

一個例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

    int main() 
    { 
     system("if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)"); // Cmd command 
     system("pause"); 
     return 0; 
    } 

存在的其他功能,或者不顯示在控制檯的修改?

謝謝你!最好的祝福。

+6

Dev C++已過時,我強烈建議您選擇另一個 – KeatsPeeks 2009-10-20 21:16:11

+0

如果沒有控制檯窗口顯示,您希望「暫停」命令如何工作? 另外cmd.exe是一個控制檯應用程序 - 有沒有簡單的方法來防止控制檯窗口顯示。 – 2009-10-20 23:01:34

+0

@Larry Osterman,很高興在SO拉里見到你;我喜歡這個博客! – BobbyShaftoe 2009-10-21 01:07:09

回答

12

你可以用CreateProcess來做到這一點。

STARTUPINFOW si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

if (CreateProcessW(command, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 
{ 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 
+0

+1謝謝你,我會測試它。這不是我正在尋找的東西,而是一個很好的答案。 – a0rtega 2009-10-21 16:19:02

+1

我在* windows 7 *中試過你的代碼,但它不起作用。我想執行** adb shell廣播-a NotifyServiceStart **。順便說一下,我已將** adb **添加到** PATH **中,並且** system()**可以很好地運行此行。 – chenzhongpu 2015-01-11 03:13:32

+0

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682425%28v=vs.85%29.aspx 「該字符串可以指定要執行的模塊的完整路徑和文件名或者它可以指定一個部分名稱,對於部分名稱,該函數使用當前驅動器和當前目錄來完成規範,該函數不會使用搜索路徑,該參數必須包含文件擴展名;沒有默認值假定延長。「 – 2015-01-11 16:04:13

3

由於FigBug指出,CreateProcess的()是要走的路,但我不認爲的CreateProcess()可以執行shell的if語句。您可能需要像這樣把它作爲一個命令:

"cmd.exe /c \"if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)\"" 

但是一個更好的解決辦法可能是使用CreateFile()測試文件是否存在,並CopyFile()將其複製。

+0

+1最後我做到了,在這種情況下是最好的解決方案。 – a0rtega 2009-10-21 16:20:44

10

您可以使用WinExec("your cmd command", SW_HIDE);而不是system("cmd command")

+1

這在Windows XP上無法正常工作...... – 2014-02-20 21:48:32

+0

謝謝。我是16位Windows的日子,但忘記了這個功能。在WIndows LogOn(Cred。Provider DLL)的重要場景中派上用場,其中CreateProcess()不被MS允許,而system()在後面有一個控制檯窗口(因此使它不是一個有吸引力的選項)。 ü! – BuddhaLight 2017-06-28 12:49:39

0

注意:我的答案不一定適合您的具體問題,但是對於「沒有命令提示符的Windows系統」和其他類似查詢,此Q & A是頂級Google result

這裏有一種執行命令的方法,而不需要新的窗口cmd.exe。基於Roland Rabien's answerMSDN,我寫了一個工作函數。

int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

    memset(&s_info, 0, sizeof(s_info)); 
    memset(&p_info, 0, sizeof(p_info)); 
    s_info.cb = sizeof(s_info); 

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

    if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) 
    { 
    WaitForSingleObject(p_info.hProcess, INFINITE); 
    CloseHandle(p_info.hProcess); 
    CloseHandle(p_info.hThread); 
    } 
} 

適用於所有Windows平臺。打電話就像你會system()