1 Востаннє редагувалося Rolana (05.05.2014 19:42:17)

Тема: Прапорці створення процесу

Таке питання... Хіба можна виставляти прапорець створення процесу числом у функції CreateProcess(...);

У мене, наприклад, така:

CreateProcess( NULL, path, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)

І, до речі, це нормально, що CreateProcess(...) не працює у цьому коді:

    TCHAR procname[1000][14]; //масив назв процесів
    FILE *f; //змінна для поточного файлу
    //--------Вичитуємо з файлу назви процесів------------
    fopen_s(&f, "c:\\abc\\TASK.TXT", "rt"); //відкриваємо в режимі читання
    while (!feof(f)) //поки не кінець файлу
    {
        _fgetts(procname[i], 14, f); //зчитуємо рядок
        _fgetts(buf, 14, f); //пересуваємося
        i++; //збільшуємо лічильник зчитаних процесів
    }
    //---------------------------------------------------
    fclose(f); //закриваємо поточний файл
    for (int j = 0; j < i; j++) //цикл на кількість процесів
         CreateProcess( procname[j], NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, _T("c:\\abc\\"), &si, &pi);

2

Re: Прапорці створення процесу

Rolana написав:

Хіба можна виставляти прапорець створення процесу числом у функції CreateProcess(...);

Чому ні?
Ото все:

 CREATE_NEW_CONSOLE,
 NORMAL_PRIORITY_CLASS,
 NULL

то є константи, т.є. їх придумали просто для легкості сприйняття, бо пам_ятати що CREATE_NEW_CONSOLE значить 0x00000010 корисно але перенапружує

Подякували: Rolana1

3 Востаннє редагувалося Chemist-i (05.05.2014 19:57:03)

Re: Прапорці створення процесу

Rolana написав:

І, до речі, це нормально, що CreateProcess(...) не працює у цьому коді:

Непрацює, тому що гадаю не по стандарту написано:
CreateProcess
там в коментарях є приклади.
От де у Вас структура lpStartupInfo?, яка у Вас si

4

Re: Прапорці створення процесу

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si));
    si.cb = sizeof(si);
    TCHAR procname[1000][14]; //масив назв процесів
    FILE *f; //змінна для поточного файлу
    //--------Вичитуємо з файлу назви процесів------------
    fopen_s(&f, "c:\\abc\\TASK.TXT", "rt"); //відкриваємо в режимі читання
    while (!feof(f)) //поки не кінець файлу
    {
    _fgetts(procname[i], 14, f); //зчитуємо рядок
    _fgetts(buf, 14, f); //пересуваємося
    i++; //збільшуємо лічильник зчитаних процесів
    }
    //---------------------------------------------------
    fclose(f); //закриваємо поточний файл
    for (int j = 0; j < i; j++) //цикл на кількість процесів
            CreateProcess( procname[j], NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, _T("c:\\abc\\"), &si, &pi);

5 Востаннє редагувалося Chemist-i (05.05.2014 20:33:58)

Re: Прапорці створення процесу

STARTUPINFO si;
...
ZeroMemory( &si, sizeof(si));
si.cb = sizeof(si);
...

Нє-а, ото все задавати треба. Бо воно передається у функцію CreateProcess.

6

Re: Прапорці створення процесу

Почитайте оце, цікаво і досить зрозуміло

7

Re: Прапорці створення процесу

ZeroMemory( &si, sizeof(si));
si.cb = sizeof(si);

Можна й просто нулями залишити. В мене виходило так запускати програми.
Дивіться, якщо усе залишити як є, а функцію CreateProcess(...) замінити на

CreateProcess( NULL, _T("тут повний шлях вказати"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

або навіть на

CreateProcess( _T("назва_програмки.exe"), NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, _T("диск:\\каталог\\"), &si, &pi))

то чудово працює.
Мені здається, що проблема саме з procname[j], але не можу збагнути, яка ж саме.

8

Re: Прапорці створення процесу

lpApplicationName [in, optional]

    The name of the module to be executed. This module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer.

    The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. This parameter must include the file name extension; no default extension is assumed.

Що Ви там пишете?

9 Востаннє редагувалося Rolana (05.05.2014 21:04:42)

Re: Прапорці створення процесу

Записую procname[j]. В моєму випадку після зчитування з файла буде так:

procname[0] = "os-demo01.exe"
procname[1] = "os-demo04.exe"
procname[2] = "os-demo05.exe"

Тобто тут зберігаються конкретні назви файлів, які треба запустити.

Ну, і відповідно зчитувалося з файла саме у форматі TCHAR.
Уривочок:

 fopen_s(&f, "c:\\abc\\TASK.TXT", "rt"); //відкриваємо в режимі читання
while (!feof(f)) //поки не кінець файлу
{
_fgetts(procname[i], 14, f); //зчитуємо рядок
_fgetts(buf, 14, f); //пересуваємося
i++; //збільшуємо лічильник зчитаних процесів
}
//---------------------------------------------------
fclose(f); //закриваємо поточний файл

10

Re: Прапорці створення процесу

Може спробуйте повний шлях?

11

Re: Прапорці створення процесу

Chemist-i написав:

Може спробуйте повний шлях?

В мене так і було на самому початку. Цікаво ще, щоб і без повного шляху працювало)

12 Востаннє редагувалося Chemist-i (05.05.2014 22:18:49)

Re: Прапорці створення процесу

То може його створити?
Щось типу цього:
[code=cpp]
...
chat* (чи TCHAR) directory = "C:\path\" або GetCurrentDirectory(...);
chat* (чи TCHAR) fullpath = strcat(directory, procname[i]);
CreateProcess( fullpath , NULL, ...
[/code]
GetCurrentDirectory

Подякували: Rolana1

13 Востаннє редагувалося Rolana (05.05.2014 22:36:18)

Re: Прапорці створення процесу

Це так я робила на самому початку)

#include "stdafx.h"
#include <windows.h>
#include "string.h"
#include <strsafe.h>

int main(int argc, char* argv[])
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    TCHAR path[1000] = _T("c:\\abc\\"), startpath[1000] = _T("c:\\abc\\"); //шлях до каталогу; одна міняється, а інша стабільна
    TCHAR procname[1000][14]; //масив назв процесів
    FILE *f; //змінна для поточного файлу
    TCHAR buf[1000];
    int i = 0, pid[1000]; //лічильник процесів, масив ідентифікаторів
    //--------Вичитуємо з файлу назви процесів------------
    fopen_s(&f, "c:\\abc\\TASK.TXT", "rt"); //відкриваємо в режимі читання
    while (!feof(f)) //поки не кінець файлу
    {
        _fgetts(procname[i], 14, f); //зчитуємо рядок
        _fgetts(buf, 14, f); //пересуваємося
        i++; //збільшуємо лічильник зчитаних процесів
    }
    //---------------------------------------------------
    fclose(f); //закриваємо поточний файл
    fopen_s(&f, "c:\\abc\\PROCESS.TXT", "wt"); //відкриваємо файл для запису ідентифікаторів
    for (int j = 0; j < i; j++) //цикл на кількість процесів
    {
        _tcscat_s(path, procname[j]); //об'єднуємо каталог і назву процесу
        ZeroMemory( &si, sizeof(si));
        si.cb = sizeof(si);
        //ZeroMemory( &pi, sizeof(pi));
        if( !CreateProcess(NULL,path, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) //створюємо процес
            return 0;
        pid[j]=GetProcessId(pi.hProcess); //зчитуємо ідентифікатор поточного процесу
        fprintf(f,"%d\n",pid[j]); //записуємо ідентифікатор у файл
        // Close process and thread handles.
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
        for (int k=0; k<14; k++) //перезаписуємо в робочу змінну шляху каталог
            path[k]=startpath[k];
    }
    fclose(f); //закриваємо файл з ідентифікаторами
    TCHAR pTASK2[] = _T("c:\\abc\\TASK2.exe"); //шлях до TASK2
    ZeroMemory( &si, sizeof(si));
    si.cb = sizeof(si);
    //ZeroMemory( &pi, sizeof(pi));
    if( !CreateProcess( pTASK2, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, _T("c:\\abc\\"), &si, &pi)) //створємо процес
        return 0;
//    printf("\n\n%ul\n",GetPriorityClass(pi.hProcess));
    puts("\n");
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    return 0;
} 

Вибачте, там код був трохи не той. Я відредагувала. Ось так в мене було спочатку.

14

Re: Прапорці створення процесу

Не треба гадати на кавовій гущі. Зробіть перевірку коду, який повертає CreateProcess за допомогою GetLastError, як це описано у документації.