Подтвердить что ты не робот

Скрыть консоль в функции C system(), Win

Я кодирую программу C в Dev-С++, и мне нужно использовать пару команд Windows (CMD). Это легко, но когда команда в функции system() выполняется, программа запускает консоль в процессе выполнения.

Пример:

#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;
    }

Существует другая функция или модификация, не отображающая консоль?

Спасибо! С наилучшими пожеланиями.

4b9b3361

Ответ 1

Вы можете использовать WinExec("your cmd command", SW_HIDE); вместо system("cmd command").

Ответ 2

Вы можете сделать это с помощью 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);
}

Ответ 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(), чтобы скопировать его.

Ответ 4

ПРИМЕЧАНИЕ. Мой ответ не обязательно соответствует вашему конкретному вопросу, но этот Q & A является лучшим результатом Google для "системы Windows без командной строки" и других подобных запросов.

Вот способ выполнения команд без нового окна cmd.exe. Основываясь на ответе Ролана Рабиена и MSDN, я написал рабочую функцию.

#include "AtlBase.h"
#include "AtlConv.h"
  int windows_system(const char *cmd) {
    PROCESS_INFORMATION p_info;
    STARTUPINFO s_info;
    DWORD ReturnValue;
    CA2T programpath(cmd);

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

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

Работает на всех платформах Windows. Вызовите так же, как вы бы system().