[C++ API Win] функция запуска дочернего процесса

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

[C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение Gloft » 2008-12-12 12:02:18

Есть необходимость написать программу которая бы запускала антивирусную проверку съемных носителей.
Написал функцию. Она работает но вот если ей задавать нужное мне приложение то ничего не выходит.
Читал много статей, MSDN, книг. Вроде бы все сделал как нужно и на сторонних приложениях работает все отлично.
Помогите. Найти причину почему не запускается в таком варианте не могу.

Код: Выделить всё

......
char szProcess[] = "\"C:\\Program Files\\Kaspersky Lab\\Kaspersky Anti-Virus 2009\\avp.com\"";
char szProcessKey[] = "scan /REMDRIVES /i1 /fa /RA:c:\\scan.log";
......
////////////////////////////////////////////////////////////////////////////////
// функция запуска дочернего процесса (1 если успешное выполнение)
////////////////////////////////////////////////////////////////////////////////
bool InitProcess( void )
{
     // определяем атрибут защиты для выполняемой задачи
     // Declared in Winbase.h; include Windows.h
     SECURITY_ATTRIBUTES sa;
     sa.lpSecurityDescriptor = NULL;            // указатель на дескриптор защиты
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);  // размер структуры в байтах
     sa.bInheritHandle = true;                 // разрешаем наследование дескрипторов
     // структура описывающая новый параметры запуска нового процесса
     // Declared in Winbase.h; include Windows.h
     STARTUPINFO si;
     ZeroMemory(&si,sizeof(STARTUPINFO));                     // обнуляем структуру
     si.cb=sizeof(STARTUPINFO);                                 // устанавливаем размер
     //si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
     //si.wShowWindow = SW_SHOW;                               //SW_HIDE;
     //si.hStdOutput = newstdout;
     //si.hStdError = newstdout;                               // перенаправляем поток
     //si.hStdInput = newstdin;                                // дочернего процесса
     // 
     // Declared in Winbase.h, include Widows.h
     PROCESS_INFORMATION pi;
     if (!CreateProcess(
                        szProcess,            // имя исполняемого модуля
                        szProcessKey,         // Командная строка
                        NULL,                 // Указатель на структуру SECURITY_ATTRIBUTES
                        NULL,                 // Указатель на структуру SECURITY_ATTRIBUTES
                        FALSE,                // Флаг наследования текущего процесса
                        CREATE_NEW_CONSOLE,   // Флаги способов создания процесса
                        NULL,                 // Указатель на блок среды
                        NULL,                 // Текущий диск или каталог
                        &si,                  // Указатель на структуру STARTUPINFO
                        &pi)){                // Указатель на структуру PROCESS_INFORMATION
                        
        return 0;       // ошибка запуска дочернего процесса
     }
     return 1;
}
....

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение paradox » 2008-12-12 12:10:14

Код: Выделить всё

char szProcess[] = "\"C:\\Program Files\\Kaspersky Lab\\Kaspersky Anti-Virus 2009\\avp.com\"";
чесно говоря что попало

Код: Выделить всё

    PROCESS_INFORMATION pi;
+       GetStartupInfo(&si);
     if (!CreateProcess(
                        szProcess,            // имя исполняемого модуля
для начала

и дальше по флагу несовсем ясно

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение Gloft » 2008-12-12 12:41:36

добавил GetStartupInfo(&si);
результат тотже
при вызове функции с параметрами представленными ниже все работает так как нужно, и без всяких ошибок.

Код: Выделить всё

char szProcess[] = "C:\\WINDOWS\\system32\\cmd.exe";
char szProcessKey[] = "/C help";
вышел из положения запуская командную строку, а уже в ней команду с параметрами
всем спс

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение paradox » 2008-12-12 12:44:29

CREATE_NEW_CONSOLE, // Флаги способов создания процесса
флаг не тот

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение Gloft » 2008-12-12 13:00:26

Можешь уточнить почему флаг не тот.
Я исходил из того, что я все же создаю новую консоль и он вполне уместен.
Само значение я брал из MSDN со страницы Process Creation Flags.
До этого пробовал разные значения, в том числе ни ставить никаких флагов.
На вопрос можешь и не отвечать, но хочется написать правильный код, да и самому любопытно в чем я ошибся.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение paradox » 2008-12-12 13:10:38

вышел из положения запуская командную строку, а уже в ней команду с параметрами
всем спс
ну если вышел значит хорошо
обычно там флаг нулевой оставляют

mumg
рядовой
Сообщения: 30
Зарегистрирован: 2009-03-03 22:39:15

Re: [C++ API Win] функция запуска дочернего процесса

Непрочитанное сообщение mumg » 2009-03-05 22:15:26

char szProcessKey[] = "\"C:\\Program Files\\Kaspersky Lab\\Kaspersky Anti-Virus 2009\\avp.com\" scan /REMDRIVES /i1 /fa /RA:c:\\scan.log";

и будет тебе щастье