Страница 1 из 1

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

Добавлено: 2008-12-12 12:02:18
Gloft
Есть необходимость написать программу которая бы запускала антивирусную проверку съемных носителей.
Написал функцию. Она работает но вот если ей задавать нужное мне приложение то ничего не выходит.
Читал много статей, 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;
}
....

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

Добавлено: 2008-12-12 12:10:14
paradox

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

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

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

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

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

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

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

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

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

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

Добавлено: 2008-12-12 12:44:29
paradox
CREATE_NEW_CONSOLE, // Флаги способов создания процесса
флаг не тот

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

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

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

Добавлено: 2008-12-12 13:10:38
paradox
вышел из положения запуская командную строку, а уже в ней команду с параметрами
всем спс
ну если вышел значит хорошо
обычно там флаг нулевой оставляют

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

Добавлено: 2009-03-05 22:15:26
mumg
char szProcessKey[] = "\"C:\\Program Files\\Kaspersky Lab\\Kaspersky Anti-Virus 2009\\avp.com\" scan /REMDRIVES /i1 /fa /RA:c:\\scan.log";

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