Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42

Подцепиться к процессу запущенному и получить ExitCode

24.11.2015, 09:53. Показов 2649. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток)
Когда испробован 101 вариант - обращаюсь к вам...
все попытки получить код выхода, сводятся к тому ,что это происходит после закрытия программы и следовательно exception что процесс не запущен или объект не создавал процесса. Запихнуть в цикл на время выполнения - плодов не дало (да и вообще идея цикла во время работы программы отстойная).
Когда сам запускаешь процесс то получить exitCode не проблема,а когда процесс запущен на стороне - не выходит.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2015, 09:53
Ответы с готовыми решениями:

Послать команду запущенному приложению (процессу)
Существует возможность послать команду запасающемуся приложению из командной строки типа: "C:\PO.exe" /UDALIT. Как послать...

Как получить доступ к запущенному приложению ArCon?
Есть программа ArCon+ версия 3.11 Вместе с ней - контрол для внешнего управления arcon.ocx Вопрос: Каким образом 'инициализировать',...

Получить доступ к длительному процессу
Подскажите, пожалуйста, как получить доступ к длительному процессу. Сделал тест, но он не даёт результата. Собственно тест: 1)...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.11.2015, 11:29
Лучший ответ Сообщение было отмечено nfs911 как решение

Решение

nfs911, можно через событие Exited получить информацию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Process[] calc = Process.GetProcessesByName("calc");
if (calc.Length > 0)
{
    calc[0].Exited += OnProcessExit;
    calc[0].EnableRaisingEvents = true;
}
 
private void OnProcessExit(object sender, EventArgs e)
{
    var process = sender as Process;
    if (process != null)
    {
        Console.WriteLine(process.ExitCode);
        //process.Dispose();
    }
}
1
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42
24.11.2015, 15:46  [ТС]
OwenGlendower, то что нужно. Не получается из этого сделать метод\класс возвращающий ответ....
вот попытка сделать класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 class GetExitCodeOfRunningPorcess
    {
        public string ExitCode;
 
        public GetExitCodeOfRunningPorcess(string processName)
        {
            Process[] xProcesses = Process.GetProcessesByName(processName);
            if (xProcesses.Length > 0)
            {
                xProcesses[0].Exited += OnProcessExit;
                xProcesses[0].EnableRaisingEvents = true;
            }
        }
 
        private void OnProcessExit(object sender, EventArgs e)
        {
            var process = sender as Process;
            if (process != null)
            {
                ExitCode = process.ExitCode.ToString();
                //process.Dispose();
            }
        }
    }
Чтобы потом сделать так:
C#
1
2
3
4
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = new GetExitCodeOfRunningProcess("calc").ExitCode;
        }
Что я делаю не так?))
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.11.2015, 17:57
nfs911, мы не знаем когда завершится процесс и, соответственно, в какой момент сработает OnProcessExit. Поэтому нужно делать ожидание завершения процесса. Плюс, раз у тебя GUI приложение, то ожидание в главном потоке заблокирует его. Значит ожидание нужно делать в другом потоке или обновлять label из обработчика OnProcessExit. Второй вариант более простой. Вот код для него:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button1_Click(object sender, EventArgs e)
{
    Process[] processes = Process.GetProcessesByName("calc");
    if (processes.Length == 0)
    {
        label1.Text = "Процесс calc не найден";
        return;
    }
    
    processes[0].Exited += OnProcessExit;
    processes[0].EnableRaisingEvents = true;
    
    label1.Text = "Ждем завершения calc";
}
 
void OnProcessExit(object sender, EventArgs e)
{
    var process = (Process)sender;
    label1.Text = process.ExitCode.ToString();
}
Цитата Сообщение от nfs911 Посмотреть сообщение
C#
1
2
3
class GetExitCodeOfRunningPorcess
{
public string ExitCode;
Если решишь оформить код в виде класса, то не надо хранить ExitCode в виде строки. Внешний код сам может преобразовать число в строку если это необходимо.
0
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42
24.11.2015, 18:45  [ТС]
OwenGlendower, я пробовал так...и оно
ругается на label1.Text в OnProcessExit
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label1' не из того потока, в котором он был создан.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.11.2015, 18:49
nfs911, используй Invoke:
C#
1
Invoke((Action)(() => label1.Text = process.ExitCode.ToString()));
1
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42
24.11.2015, 20:42  [ТС]
OwenGlendower, не могу понять - почему сделав присвоение ExitCode к label1 в отдельном потоке - блочится главный поток(форма)?он он же в отдельном...в чем дело?))
PS:после processes[0].EnableRaisingEvents = true; вставил processes[0].WaitForExit();чтобы чтение переменной ExitCode в классе,произошло после завершения процесса. (т.е. начать присвоение но с отсрочкой)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.11.2015, 20:47
nfs911, вызов WaitForExit() блокирует главный поток. Через некоторое время срабатывает OnProcessExit который обновляет метку с помощью Invoke() который сможет это сделать только если главный поток не занят. А он занят ожиданием завершения потока. Классическая взаимблокировка.
1
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42
24.11.2015, 21:03  [ТС]
OwenGlendower, *крик души*))) И как быть? С семафорами поиграться чтоли?
Уже ума не приложу как это реализовать...вот если бы OnProcessExit возвращал ExitCode в дочерний метод...
или чтобы OnProcessExit был как WaitForExit ))
--------------------------------------------------
Еще вариант: Запустить эту функцию получения ExitCode
и после нее параллельно событие на изменение переменной ExitCode,при срабатывании которого происходило присвоение.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.11.2015, 23:17
Лучший ответ Сообщение было отмечено nfs911 как решение

Решение

nfs911, если тебе так сильно нужно синхронное исполнение, то можно с помощью WinAPI это сделать:
C#
1
int exitCode = ProcessHelper.GetExitCode("calc");
ProcessHelper
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
static class ProcessHelper
{
    public static int GetExitCode(string processName)
    {
        var processes = Process.GetProcessesByName(processName);
        if (processes.Length == 0) throw new InvalidOperationException("Process isn't running");
        
        if (processes.Length > 1)
        {
            foreach (var process in processes) process.Dispose();
            throw new InvalidOperationException("More than one process is running");
        }
        
        var p = processes[0];
        const uint QueryLimitedInformation = 0x00001000;
        IntPtr h = OpenProcess(QueryLimitedInformation, false, p.Id);
        p.WaitForExit();
        p.Dispose();
        
        int exitCode;
        GetExitCodeProcess(h, out exitCode);
        CloseHandle(h);
        
        return exitCode;
    }
    
    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(uint processAccess, bool bInheritHandle, int processId);
    
    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetExitCodeProcess(IntPtr hProcess, out int lpExitCode);
    
    [DllImport("kernel32.dll", SetLastError=true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool CloseHandle(IntPtr hObject);
}
1
2 / 2 / 2
Регистрация: 20.01.2013
Сообщений: 42
27.11.2015, 23:01  [ТС]
OwenGlendower, спасибо,буду разбираться)) WinAPI не синхронный т.к. там WaitForExit(); и блочит главный поток (как вы сказали ранее) но все равно спс,тут реализовано тоже так как я хотел.Еще немного поэкспериментирую и может получится в отдельный поток пихнуть...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
28.11.2015, 17:53
Цитата Сообщение от nfs911 Посмотреть сообщение
WinAPI не синхронный т.к. там WaitForExit();
Как раз таки синхронный. Благодаря WaitForExit метод не вернет управление пока процесс не завершится.

Цитата Сообщение от nfs911 Посмотреть сообщение
и блочит главный поток
Разумеется. Любой синхронный вызов занимает поток в котором он исполняется.

Цитата Сообщение от nfs911 Посмотреть сообщение
может получится в отдельный поток пихнуть.
Если тебе нужно решение без блокировки, то используй событие Exited пример для которого приведен выше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 17:53
Помогаю со студенческими работами здесь

Получить список подгруженных DLL к процессу
Смотрю у процесса через Process.Modules, однако показывает лишь малую часть dll'ok. Возможно из-за активного свойства UseShellExecute у...

OpenProcess, программа не может получить доступ к процессу
Здравствуйте уважаемые форумчане я пишу Trainer для одной игры под названием WM3 столкнулся с такой проблемой когда я запускаю трейнер он...

Передача аргументов запущенному приложению
Возможно ли передать аргументы уже запущенному приложению? Заранее благодарю за ответы. :)

Удаленный доступ к сайту, запущенному на openserver
Не знаю в правильной ветке форума пишу или нет, но это очень СРОЧНО Можно сделать так, чтоб было возможно заходить удаленно на...

Передача команды стороннему (запущенному) приложению
Как возможно передавать команду запущенному приложению? Необходимо в TotalCommander открыть определенный каталог. пока вижу единственное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru