Умножение выставок, рабочих мест и WinAPI - PullRequest
0 голосов
/ 21 февраля 2020

каждый!

У меня есть проблема, которую я не знаю, как решить:

  1. Когда я отправляю значение в функцию по указателю, TerminateJobObject не делает ' не работает.
  2. Не знаю, как убить не всю работу, только выбранную.

Вот мой код:

    #define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<windows.h>
using namespace std;

bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute);
void KillProcess(HANDLE hSoftwareJob);

int main()
{
    const int SIZE_CALC = 3, SIZE_PAINT = 1, SIZE_PAD = 2;
    HANDLE calcJob, paintJob, padJob;
    cout << "Execute calculator\n";
    if (!ExecuteSoftware(&calcJob, "calc.exe", SIZE_CALC))
    {
        cout << "Can't execute all process\n";
        Sleep(1500);
    }
    cout << "Execute paint\n";
    if(!ExecuteSoftware(&paintJob, "mspaint.exe", SIZE_PAINT))
    {
        cout << "Can't execute all process\n";
        Sleep(1500);
    }
    cout << "Execute WordPad\n";
    if(!ExecuteSoftware(&padJob, "write.exe", SIZE_PAD))
    {
        cout << "Can't execute all process\n";
        Sleep(1500);
    }

    Sleep(5000);

    cout << "Killing groups\n";

    KillProcess(calcJob);
    KillProcess(paintJob);
    KillProcess(padJob);
    TerminateProcess(calcJob, 0);

    /*for (int i = 0; i < 10; i++)
    {
        hJob[i] = CreateJobObject(NULL, (LPCSTR)L"calcJob");
    }
    HANDLE jobCalc = CreateJobObject(NULL, (LPCSTR)L"calcJob");
    PROCESS_INFORMATION* calcs = new PROCESS_INFORMATION[SIZE_CALC];
    JOBOBJECT_BASIC_LIMIT_INFORMATION jInfo;


    ExecuteCalc(SIZE_CALC);
    Sleep(5000);
    KillProcess();*/
    Sleep(2500);

    return 0;
}

bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute)
{
    STARTUPINFO si;
    LPTSTR lpszSystemInfo;
    PROCESS_INFORMATION pi;
    TCHAR tchBuff[MAX_PATH + 1];

    lpszSystemInfo = tchBuff;
    GetSystemDirectory(lpszSystemInfo, MAX_PATH + 1);
    wsprintf(tchBuff, "%s\\%s", lpszSystemInfo, name);

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

    for (int i = 0; i < countExecute; i++)
    {
        if (!CreateProcess(NULL, tchBuff, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi))
        {
            return false;
        }
        else
        {
            AssignProcessToJobObject(hSoftwareJob, pi.hProcess);
            Sleep(500);
        }
    }

    return true;
}


void KillProcess(HANDLE hSoftwareJob)
{
    TerminateJobObject(hSoftwareJob, 0);
}

Моя задача: Launch of any number of programs and their selective or group termination

Извините за мой английский sh.

1 Ответ

0 голосов
/ 03 марта 2020

Во-первых, как указано в комментарии, вам не хватает инициализации.

HANDLE notepadJob = CreateJobObject(NULL, NULL);

Во-вторых, вы должны передать значение, на которое указывает hSoftwareJobto, assignprocesstojobobject.

* 1007. *

В-третьих, из AssignProcessToJobObject do c сказано, что только настольные приложения .

Настольное приложение в C ++ является нативным приложением он может получить доступ к полному набору Windows API и работает либо в окне, либо в системной консоли. Настольные приложения в C ++ могут работать от Windows XP до Windows 10 (хотя Windows XP больше не поддерживается официально, и с тех пор появилось много Windows API).

A Настольное приложение отличается от универсального Windows Платформа (UWP), которое может работать на ПК с Windows 10, а также на XBox, Windows Phone, Surface Hub и других устройствах.

См .: Настольные приложения (Visual C ++)

Например, calculator - это типичное приложение UWP, поэтому его нельзя использовать с AssignProcessToJobObject.

Модифицированный код: (Блокнот используется для теста)

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<windows.h>
using namespace std;

bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute);
void KillProcess(HANDLE hSoftwareJob);
int main()
{
    HANDLE notepadJob;
    const int SIZE_NOTE = 3;
    notepadJob = CreateJobObject(NULL, NULL);

    cout << "Execute WordPad\n";
    if (!ExecuteSoftware(&notepadJob, const_cast<char*>("notepad.exe"), SIZE_NOTE))
    {
        cout << "Can't execute all process\n";
        Sleep(1500);
    }



    cout << "Killing groups\n";

    KillProcess(notepadJob);


    Sleep(2500);

    return 0;
}

bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute)
{
    STARTUPINFO si;
    LPTSTR lpszSystemInfo;
    PROCESS_INFORMATION pi;
    TCHAR tchBuff[MAX_PATH + 1];

    lpszSystemInfo = tchBuff;
    GetSystemDirectory(lpszSystemInfo, MAX_PATH + 1);
    wsprintf(tchBuff, "%s\\%s", lpszSystemInfo, name);

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

    for (int i = 0; i < countExecute; i++)
    {
        if (!CreateProcess(NULL, tchBuff, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi))
        {
            return false;
        }
        else
        {
            AssignProcessToJobObject(*hSoftwareJob, pi.hProcess);
            int err = GetLastError();
        }
    }

    return true;
}


void KillProcess(HANDLE hSoftwareJob)
{
    TerminateJobObject(hSoftwareJob, 0);
    int err = GetLastError();
}
...