2009-10-20 40 views
12

Dev-C++에서 C 프로그램을 코딩 중이며 몇 가지 Windows (CMD) 명령을 사용해야합니다. 쉽지만 system() 함수의 명령을 실행하면 프로그램이 실행될 때 콘솔이 실행됩니다.C 시스템() 함수에서 콘솔 숨기기

예 :

#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

+0

표시되는 콘솔 창이 없으면 "일시 중지"명령이 어떻게 작동 할 것으로 예상합니까? 또한 cmd.exe는 콘솔 응용 프로그램이므로 콘솔 창이 표시되지 않도록하는 쉬운 방법은 없습니다. –

+0

@ Larry Osterman, SO Larry에서 만나서 반가워요. 나는 그 블로그를 즐긴다! – BobbyShaftoe

답변

12

CreateProcess로 할 수 있습니다. FigBug가 언급 한 바와 같이

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

+1

* Windows 7 *에서 코드를 시도했지만 작동하지 않습니다. ** adb 쉘을 방송하고 싶습니다 - NotifyServiceStart **. 그건 그렇고, ** ** ** ** ** ** ** ** ** ** ** ** 시스템 ** (**) **이 라인을 잘 실행할 수 있습니다. – chenzhongpu

+0

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682425%28v=vs.85%29.aspx "문자열은 실행할 모듈의 전체 경로와 파일 이름을 지정할 수 있습니다 부분 이름을 지정할 수있는 경우 함수는 현재 드라이브와 현재 디렉토리를 사용하여 사양을 완료합니다. 함수는 검색 경로를 사용하지 않습니다.이 매개 변수에는 파일 이름 확장명이 포함되어야하며 기본값은 없습니다. 확장이 가정됩니다." –

3

는 CreateProcess를()는 길을 가야하는 것입니다,하지만 난 CreateProcess를()는 쉘 if 문을 실행할 수 있다고 생각하지 않습니다. 당신은 명령으로이 같은 것을 통과해야 할 수 있습니다

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

그러나 더 나은 솔루션은 파일이 존재하고 CopyFile() 그것을 복사 할 경우 테스트 CreateFile()을 사용할 수 있습니다.

+0

+1 마지막으로 나는이 경우 가장 좋은 해결책입니다. – a0rtega

10

system("cmd command") 대신 WinExec("your cmd command", SW_HIDE);을 사용할 수 있습니다.

+1

이것은 Windows XP에서 작동하지 않았습니다 ... –

+0

16 비트 Windows의 시대입니다.하지만이 기능을 잊어 버렸습니다. CreateProcess()가 MS에서 허용되지 않은 WIndows LogOn (Cred. Provider DLL)의 중요한 시나리오에서 유용하게 사용되었으며 system()은 콘솔 창을 가지고있어서 매력적인 옵션이 아닙니다. 유! – BuddhaLight

0

참고 : 내 대답은 사용자의 특정 질문에 반드시 맞출 필요는 없지만이 Q & A는 "명령 프롬프트가없는 Windows 시스템"및 기타 유사한 쿼리의 경우 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()처럼 전화하십시오.