обнаружьте завершение программы (C, Windows)

HttpWebRequest используется для этого.

На обратной передаче, создайте HttpWebRequest своему третьему лицу и отправьте данные формы, тогда как только это сделано, Вы можете Ответ. Перенаправление везде, где Вы хотите.

Вы получаете добавленное преимущество, которое Вы не должны называть все свое управление сервером, чтобы заставить третьи стороны сформировать, можно сделать этот перевод при создании строки POST.

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";                        
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

Однако при необходимости в пользователе для наблюдения страницы ответа от этой формы, единственная опция состоит в том, чтобы использовать Сервер. Передача, и это может или не может работать.

8
задан wonderer 8 September 2009 в 14:09
поделиться

7 ответов

1. Win32

Win32 API содержит способ сделать это с помощью функции SetUnhandledExceptionFilter , а именно:

LONG myFunc(LPEXCEPTION_POINTERS p)
{
     printf("Exception!!!\n");     
     return EXCEPTION_EXECUTE_HANDLER;
}

int main()
{
     SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&myFunc);    
     // generate an exception !
     int x = 0;
     int y = 1/x;
     return 0;
}

2. POSIX / Linux

Я обычно делаю это с помощью функции signal () , а затем обрабатываю сигнал SIGSEGV соответствующим образом. Вы также можете обрабатывать сигнал SIGTERM и SIGINT, но не SIGKILL (по замыслу). Вы можете использовать strace () , чтобы получить обратную трассировку, чтобы увидеть, что вызвало сигнал.

9
ответ дан 5 December 2019 в 10:04
поделиться

Это зависит от того, что вы делаете со своими «исключениями». Если вы обработаете их должным образом и выйдете из программы, вы можете зарегистрировать свою функцию, которая будет вызываться при выходе, используя atexit () .

Это не будет работать в случае реального аварийного завершения, такого как segfault.

Не знаю о Windows, но в POSIX-совместимой ОС вы можете установить обработчик сигналов, который будет улавливать разные сигналы и что-то делать с ними. Конечно, вы не можете поймать SIGKILL и SIGSTOP .

Signal API является частью ANSI C с C89, поэтому, вероятно, Windows поддерживает его. См. Подробности в системном вызове signal () .

2
ответ дан 5 December 2019 в 10:04
поделиться

Если это только для Windows, вы можете использовать SEH ( SetUnhandledExceptionFilter ) или VEH ( AddVectoredExceptionHandler , но только для XP / 2003 и выше)

1
ответ дан 5 December 2019 в 10:04
поделиться

Извините, я не Windows-программист. Но, возможно,

_onexit()

Регистрирует функцию, которая будет вызываться при завершении программы.

http://msdn.microsoft.com/en-us/library/aa298513%28VS.60%29.aspx

0
ответ дан 5 December 2019 в 10:04
поделиться

Во-первых, хотя это довольно очевидно: у вас никогда не может быть полностью надежного решения - кто-то может всегда просто ударяйте по кабелю питания, чтобы завершить процесс. Итак, вам нужен компромисс, и вам нужно тщательно изложить детали этого компромисса.

Одно из наиболее надежных решений - поместить соответствующий код в программу-оболочку. Программа-оболочка вызывает вашу «настоящую» программу, ожидает завершения ее процесса, а затем - если ваша «настоящая» программа специально не сигнализирует о том, что она завершилась нормально - запускает код очистки. Это довольно распространено для таких вещей, как тестовые жгуты, когда тестовая программа может аварийно завершить работу, прервать работу или иным образом неожиданно умереть.

Это по-прежнему создает трудности, связанные с тем, что произойдет, если кто-то выполнит TerminateProcess над вашей функцией-оболочкой, если вам нужно об этом беспокоиться. При необходимости вы можете обойти это, настроив его как службу в Windows и используя функции операционной системы, чтобы перезапустить ее, если она умирает. (Это просто немного меняет ситуацию; кто-то все еще может просто остановить службу.) На этом этапе вы, вероятно, находитесь в точке, где вам нужно сигнализировать об успешном завершении чем-то постоянным, например, созданием файла.

0
ответ дан 5 December 2019 в 10:04
поделиться

Есть темы форума sysinternals о защите от попыток конечного процесса путем подключения внутренних компонентов NT, но на самом деле вам нужен либо сторожевой таймер, либо равноправный процесс (разумный подход) или какой-нибудь метод перехвата катастрофических событий (довольно рискованный).

Edit: Есть причины, по которым они усложняют это, но можно перехватить или заблокировать попытки убить ваш процесс. Я знаю, что вы просто пытаетесь очистить перед выходом, но как только кто-то освобождает процесс, который нельзя немедленно убить, кто-то попросит метод, чтобы немедленно его убить, и так далее. В любом случае, чтобы пойти по этому пути, просмотрите ссылку выше и выполните поиск по ключевым словам, которые вы там найдете, чтобы получить больше. перехватчик ИЛИ фильтр NtTerminateProcess и т. Д. Мы говорим о коде ядра, драйверах устройств, антивирус, безопасность, вредоносное ПО, руткиты здесь. Некоторые книги, которые могут помочь в этой области: Windows NT / 2000 Native API , Недокументированные секреты Windows 2000: Поваренная книга программиста , Руткиты: подрыв ядра Windows и , конечно, Внутреннее устройство Windows®: Пятое издание . Это несложно закодировать, но довольно сложно понять, и вы можете вызвать неожиданные побочные эффекты.

Возможно, Функции восстановления и перезапуска приложений могут быть полезны? Поддерживается Vista и Server 2008 и более поздних версий.

Функция обратного вызова ApplicationRecoveryCallback Определяемая приложением функция обратного вызова, используемая для сохранения данных и информации о состоянии приложения в случае, если приложение обнаруживает необработанное исключение или перестает отвечать.

При использовании SetUnhandledExceptionFilter , Социальная дискуссия MSDN советует, чтобы для надежной работы этой функции исправление этого метода в памяти - единственный способ гарантировать, что ваш фильтр будет вызван. Советует вместо этого использовать __try / __ except. Тем не менее, в статье «SetUnhandledExceptionFilter» и VC8 есть пример кода и обсуждение вызовов фильтрации SetUnhandledExceptionFilter.

Также см. Windows SEH Revisited для некоторых пример кода AddVectoredExceptionHandler .

Советует вместо этого использовать __try / __ except. Тем не менее, в статье «SetUnhandledExceptionFilter» и VC8 есть пример кода и обсуждение вызовов фильтрации SetUnhandledExceptionFilter.

Также см. Windows SEH Revisited для некоторых пример кода AddVectoredExceptionHandler .

Советует вместо этого использовать __try / __ except. Тем не менее, в статье «SetUnhandledExceptionFilter» и VC8 есть пример кода и обсуждение вызовов фильтрации SetUnhandledExceptionFilter.

Также см. Windows SEH Revisited для некоторых пример кода AddVectoredExceptionHandler .

5
ответ дан 5 December 2019 в 10:04
поделиться

Несколько лет назад я опубликовал на ddj.com статью о «посмертной отладке».

Он включает исходные коды для Windows и unix / linux для обнаружения аварийного завершения. Однако по моему опыту, обработчик Windows, установленный с помощью SetUnhandledExceptionFilter, не всегда вызывается . Во многих случаях он вызывается, но я получаю довольно много файлов журналов от клиентов, которые не включают отчет от установленных обработчиков, где, например, причиной было НАРУШЕНИЕ ДОСТУПА.

http://www.ddj.com/ инструменты разработки / 185300443

0
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: