Я хочу запустить B.exe
в моем основном приложении A.exe
как ребенок. Я знаю, как сделать это в C#, но я не могу найти ничего на Inte rnet, чтобы показать мне, как это сделать в C ++.
Я хочу запустить EXE
в моем основной процесс, и когда мой основной процесс отключается, дочерние процессы тоже закрываются.
Как и Unity, например:
Я знаю, что могу использовать WinExec()
для создания дочерних процессов, но мне нужно сделать это с помощью CreateProcess()
.
Консольное приложение CHILD cpp:
#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
cout << "Child App is running..." << endl;
while (true)
{
}
}
Консольное приложение MainApp cpp:
#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
#define CHILD_PROCESS L"ChildApp.exe"
#define _WIN32_WINNT 0x05010000
#include <windows.h>
#include <winbase.h>
HANDLE Jobject = CreateJobObject(NULL,L"Job");
JOBOBJECT_EXTENDED_LIMIT_INFORMATION JBLI;
int CreateChildProcess(const wchar_t* chile_pe) {
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
try
{
if (Jobject == NULL)
{throw "COULD NOT CREATE JOB OBJECT!";}
if (!AssignProcessToJobObject(Jobject, OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId())))
{ return 1; }
if (!QueryInformationJobObject(Jobject, JobObjectExtendedLimitInformation, &JBLI, sizeof(JBLI), NULL))
{ return 2; }
JBLI.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_BREAKAWAY_OK;
if (!SetInformationJobObject(Jobject, JobObjectExtendedLimitInformation, &JBLI, sizeof(JBLI)))
{ return 3; }
CreateProcess((LPWSTR)chile_pe, NULL, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
std::cout << "Child Process ID: " << pi.dwProcessId << "\tThread ID: " << pi.dwThreadId << "\tHandle: " << pi.hProcess << "\n";
WaitForSingleObject(pi.hProcess, INFINITE);
TerminateProcess(pi.hProcess, 1816);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(Jobject);
return -1;
}
catch (char* Message)
{
std::cout << Message << " " << GetLastError() << "\n";
return 0;
}
}
int main()
{
cout << "MainApp Started..." << endl;
cout << "Starting Child Process..." << endl;
int childproc = CreateChildProcess(CHILD_PROCESS);
if (childproc == -1) {
cout << "MainApp Finished." << endl;
}
else {
cout << "MainApp Finished with Error : " << childproc << endl;
}
getchar();
}