Мне нужно связать программу Windows C ++ с устаревшей программой GNAT Ada. Программа Windows порождает устаревшую программу Ada как отдельный процесс, а затем ожидает ее возврата.
Я могу написать основную программу Ada как функцию, которая возвращает целое число. Я вижу, что в Window я могу дождаться завершения процесса вызовом WaitForSingleObject()
и что я мог бы позвонить GetExitCodeProcess()
— но ни один из них, кажется, не говорит мне, что возвратила программа Ады — я прав?
Возвращаемые значения, по-видимому, связаны с тем, возвращали ли сами вызовы ошибки, а не вызываемый процесс.
Должен ли я изучить информацию о ручках процесса или что-то подобное?
Кто-нибудь может прояснить мне, как вернуть возвращаемое значение программы Ada в вызывающую программу Windows?
Я предполагаю, что у вас нет доступа к исходному приложению или вы предпочитаете не вносить никаких изменений.
Если устаревшее приложение записывает результат в стандартный вывод (STDOUT
), вы можете перенаправить STDOUT
а также STDERR
программы Ада трубе.
Позже вы можете извлечь информацию из канала и проанализировать ее в вашей C ++ программе.
Вы можете найти здесь пример о том, как перенаправить STDOUT
трубе в винде:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx
Другой способ — перенаправить вывод во временный файл и проанализировать файл, как только вы обнаружите, что процесс завершен.
Программы Ada обычно устанавливают код выхода точно так же, как программы, написанные на любом другом языке, хотя стандартная библиотека предусматривает только Success
а также Failure
(сопоставлено с соответствующими значениями, специфичными для операционной системы).
Вы проверили, решили ли разработчики приложения, которое вы вызываете, по какой-либо причине использовать один и тот же код выхода, независимо от результата выполнения? (Чтение документации может быть полезным. 😉
Документация Microsoft была неясной. Это то, что мне нужно было помочь.
Программу Ada нужно было изменить, чтобы основная процедура была изменена на основную функцию, возвращающую int. Итак, когда он был порожден в другом процессе и затем завершен, мне нужен был способ, чтобы это возвращаемое значение вернулось в родительский процесс. Фактически, переменная DWORD, чей адрес был передан в GetExitCodeProcess (), фактически возвращает значение, возвращаемое программой Ada. Из прочтения документации MS не было ясно, будет ли возвращаемое значение из программы Ada или какой-то код ошибки Windows, связанный с процессом …
Во всяком случае, спасибо за помощь.