Здравствуйте,
У меня есть серверное приложение, которое в своем процессе запускает внешние объекты (plugin), загружаемые из dll. Внещний код выполняется в одном из рабочих потоков сервера. Необходимо защитить сервер от ошибок, которые могут быть в плагинах. Самая первая идея, которая пришла мне в голову — обернуть вызов внешнего кода в блок обработки исключений try-catch или __try-except .
Я столкнулся с кодом, который убивает приложение, но не отлавливается обработкой исключений. Вот пример такого кода:
//Необходимо компилировать с ключом /EHa
#include "stdafx.h"
#include "stdarg.h"
#include "excpt.h"
#include "windows.h"
void TestParamStr(_TCHAR* lpszParam,...)
{
va_list args;
va_start(args,lpszParam );
TCHAR szBuf[256];
szBuf[0]=TCHAR(0);
_vstprintf_s(szBuf, 256, lpszParam, args);
}
int _tmain(int argc, _TCHAR* argv[])
{
int dwRes(0);
__try
{
TestParamStr(_T("%d %d %"), 0);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, _T("Exception"), _T("Exception"), MB_OK);
dwRes = 1;
}
return dwRes;
}
Т.к. в строке параметров функции _vstprintf_s количество ожидаемых параметров превышает количество реально передаваемых — вываливается ошибка, которая не отлавливается ни __try — __except, ни try-catch, программа умирает .
Вопрос:
1) Как отловить такую ошибку или защитить приложение от таких ошибок ?
2) Как лучше реализовать защиту приложения от ошибок во внешнем коде ?
Приходит в голову вариант с созданием внешнего процесса, в кот. выполнять код (так, чтобы если внешний код убивает приложение, то вываливался бы только процесс-хостер внешнего кода), и организацией межпроцессного взаимодейтсвия, но этот путь видится мне достаточно трудоемким и непростым в реализации.
Спасибо,
Armastab.