Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2015, 03:18   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Куда копать?

Нужна программа на C++ для Windows, которая бы висела в процессах и следила за приложением. Если в приложении возникает ошибка, то релоадер закрывает окно ошибки и перезапускает приложение. Прикреплены примеры ошибок. Лучше даже, чтобы окно ошибки вообще не показывалось (как то фильтровались?). Если приложение завершается, не выключив релоадер, то перезапускать приложение так-же.


Сидел я значит на одном форуме и наткнулся на такое ТЗ во фрилансе. Стало интересно как такое сделать? В какую сторону копать? Вообще не представляю) Люди заказ берут, значит возможно.
Praud вне форума Ответить с цитированием
Старый 06.02.2015, 03:49   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Окно ошибки можно отлавливать по заголовку окна ошибки. В windows есть таймер, которыми можно проверять через определенное время, какие окна есть в системе.

Для перечисления окон в системе можно использовать winapi функцию EnumWindows. Заголовок окна получить функцией GetWindowText. Запуск процесса -CreateProcess.

Пример использования подобных функций

Код:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <Psapi.h>
#include <Sddl.h>
#include <AccCtrl.h>
#include <Aclapi.h>

#pragma comment (lib, "wsock32.lib")
#pragma comment (lib, "Kernel32.lib")
#pragma comment (lib, "Psapi.lib")
#pragma comment (lib, "user32.lib")
#pragma comment (lib, "Gdi32.lib")
#pragma comment(lib, "advapi32.lib")


BOOL CALLBACK e2(HWND hwnd, LPARAM l)
{
char str[1024];
GetWindowText(hwnd, str, 1024);
printf("child: %x %s\n", hwnd, str);

return 1; 
}



BOOL CALLBACK e(HWND hwnd, LPARAM l)
{
char str[1024];
GetWindowText(hwnd, str, 1024);
printf("main: %x %s\n", hwnd, str);
EnumChildWindows(hwnd, (WNDENUMPROC) &e2, 0);
return 1;
}


int main(int argc, char* argv[])
{
DWORD b;
DWORD p[1024];
int i;
int r;
HANDLE h;
HMODULE m[1024];
DWORD b2;
int j;
char str[1024];
PROCESS_MEMORY_COUNTERS pm;
HWND hw;
HDC hdc;
SIZE x;
WIN32_FIND_DATA wf;
HANDLE hl;
HDC hdc2;
STARTUPINFO si;
PROCESS_INFORMATION pf;
int i1,i2,i3,i4;
SECURITY_ATTRIBUTES  sa1;
SECURITY_ATTRIBUTES  sa2;
char str2[1024];
char str3[1024];
char str4[1024];
SECURITY_INFORMATION sinf;
PSID ps1;
PSID ps2;
PACL pa1;
PACL pa2;
PSECURITY_DESCRIPTOR sd;


printf("error:%x %d\n", GetLastError(), GetLastError()); 
hl = FindFirstFile("*\0", &wf); 
printf("%s\n", wf.cFileName); 
while(FindNextFile(hl, &wf) ) 
printf("%s\n", wf.cFileName); 
hw = GetConsoleWindow(); 
hdc = GetDC(hw); 
hdc2 = GetDC(NULL); 
for(i1 = 30, i3 = 600; i1< 130; i1++, i3++) 
for(i2 = 30, i4 = 600; i2< 130;  i2++, i4++) 
SetPixel(hdc2, i3, i4, GetPixel(hdc2, i1, i2)); 
SetBkColor(hdc, RGB(0, 255, 0)); 
ScaleWindowExtEx(hdc, 5, 1, 5, 1, &x); 
ReleaseDC(hw, hdc);  
ReleaseDC(0, hdc2); 
printf("%d %d\n", x.cx, x.cy); 
SetConsoleTitle("_\0");
EnumProcesses(p, sizeof(p), &b);
r = b / sizeof(DWORD);
printf("r:%d\n", r);

for(i = 0;i < r;i++)
{
printf("Open: %d ", p[i]);
h = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, p[i]);
GetSecurityInfo(h, SE_UNKNOWN_OBJECT_TYPE, sinf, &ps1, &ps2, &pa1 ,&pa2, &sd);
ConvertSidToStringSid(&ps1, (LPSTR * ) &str2);
printf("%s\n", str2);
ZeroMemory(&pm, sizeof(pm));
GetProcessMemoryInfo(h, &pm, sizeof(pm) );
printf("\n");
printf("PageFaultCount:%x %d\n", pm.PageFaultCount, pm.PageFaultCount );
printf("PeakWorkingSetSize: %x %d\n", pm.PeakWorkingSetSize, pm.PeakWorkingSetSize / 1024);
printf("WorkingSetSize: %x %d\n", pm.WorkingSetSize, pm.WorkingSetSize / 1024);
printf("QuotaPeakPagedPoolUsage: %x %d\n", pm.QuotaPeakPagedPoolUsage, pm.QuotaPeakPagedPoolUsage / 1024);
printf("QuotaPagedPoolUsage: %x %d\n", pm.QuotaPagedPoolUsage, pm.QuotaPagedPoolUsage / 1024);
printf("QuotaPeakNonPagedPoolUsage: %x %d\n", pm.QuotaPeakNonPagedPoolUsage, pm.QuotaPeakNonPagedPoolUsage / 1024);
printf("QuotaNonPagedPoolUsage: %x %d\n", pm.QuotaNonPagedPoolUsage, pm.QuotaNonPagedPoolUsage / 1024);
printf("PagefileUsage: %x %d\n", pm.PagefileUsage, pm.PagefileUsage / 1024);
printf("PeakPagefileUsage: %x %d\n", pm.PeakPagefileUsage, pm.PeakPagefileUsage / 1024);
EnumProcessModules(h, m, sizeof(m),  &b2);
for(j = 0;j < ( sizeof(b2) /sizeof(HMODULE) ) ;j++)
{
GetModuleFileNameEx(h, m[j], str, 1024);
printf("%s\n", str);
}
CloseHandle(h);
printf("\n");
}
EnumWindows( (WNDENUMPROC) &e, 0);
ZeroMemory(&si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pf, sizeof(pf) );
ZeroMemory(&sa1, sizeof(sa1) );
ZeroMemory(&sa2, sizeof(sa2) );
sa1.nLength = sizeof(sa1);
sa1.bInheritHandle = 0;
sa2.nLength = sizeof(sa2);
sa2.bInheritHandle = 0;
if ( ! CreateProcess(0,argv[0],&sa1,&sa2, 0, 0, 0,0, &si, &pf) )
{
printf("error:%x %d\n", GetLastError(), GetLastError());
}
else
{
CloseHandle(pf.hProcess);
CloseHandle(pf.hThread);
}


 return 0;
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как собрать данные с начала года. Помогите определить направление, куда копать. Swatch SQL, базы данных 12 09.04.2014 12:25
В какую сторону копать?! shebelme WordPress и другие CMS 3 02.12.2013 12:48
Защита от виртуалки, куда копать? FleXik Общие вопросы Delphi 4 15.10.2013 12:15
Куда копать: при открытии - ругается alex77755 Microsoft Office Excel 6 07.10.2011 16:21
Internet TV: куда копать? MyasNick Мультимедиа в Delphi 2 30.12.2008 18:42