Ответ 1
Вы можете использовать WinExec("your cmd command", SW_HIDE);
вместо system("cmd command")
.
Я кодирую программу 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;
}
Существует другая функция или модификация, не отображающая консоль?
Спасибо! С наилучшими пожеланиями.
Вы можете использовать WinExec("your cmd command", SW_HIDE);
вместо system("cmd command")
.
Вы можете сделать это с помощью 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);
}
Как заявил 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(), чтобы скопировать его.
ПРИМЕЧАНИЕ. Мой ответ не обязательно соответствует вашему конкретному вопросу, но этот 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()
.