2009-10-20 28 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()