Другой подход
Бесполезно в всех ситуациях, однако у меня был один конкретный сценарий, когда приложение полностью контролировало дочерний процесс. Для связи и перехвата API потребовалась инъекция DLL, поэтому в реальных дочерних процессах DLL работает, чтобы отчитываться перед родителем.
Примечание: Теперь это не награда за креативность. Справочная информация здесь: Приложение, которое нужно было обернуть, однако это было устаревшее приложение, которое нельзя было ни изменить, ни переписать удовлетворительным образом. Нам нужно было поддерживать эту систему, продолжая перехватывать выходные данные.
Кроме того, дочерний процесс был плохо написан, сразу же запуская себя и затем завершаясь, поэтому родительский процесс на самом деле не наше основное приложение.
Если вы управляете дочерними процессами и в любом случае имеете внедренную DLL, вы можете расширить эту DLL с помощью , отслеживая родительский процесс, чтобы проверить, запущен ли он. Если нет, ExitProcess
.
Если вам не нужна DLL в дочернем процессе, другие решения, скорее всего, будут намного лучше.
Вы можете передать parentProcessID
, например, через ключ реестра, который вы уже используете в своем приложении. Или вы можете передать командную строку, если это не нарушает дочерний процесс.
Это должно выполняться в своем собственном потоке. В моей DLL было два потока: здесь этот код и код управления и связи.
DLL
bool IsProcessRunning(HANDLE hProcess)
{
DWORD exitCode;
GetExitCodeProcess(hProcess, &exitCode);
return exitCode == STILL_ACTIVE;
}
bool WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
int parentProcessID = [...]
HANDLE parentProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, parentProcessID);
while (IsProcessRunning(parentHandle)) Sleep(100);
ExitProcess(0);
}
return true;
}