Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите написать програмулину котрую нельзя было бы закрыть. / 8 сообщений из 8, страница 1 из 1
09.09.2003, 21:40
    #32260558
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Передо мной стоит задача написать проргамулину (CBuilder5) которую не смог бы закрыть юзер. Есть несколько методов, но в каждом есть какаято причина.
1) Спрятать программу в TaskManager .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   typedef (WINAPI *reg)(DWORD,DWORD);
   reg r =  0 ;
   HMODULE hm = LoadLibrary ( "kernel32.dll" );
   r = (reg) GetProcAddress (hm,  "RegisterServiceProcess" );
   if(!r){
     if(hm){FreeLibrary(hm);};
     return;
   };
   r( 0 , true);
   FreeLibrary (hm);

Этот способ отлично работает под Win9x, но в 2к нет такой функции.

2) При закрытии программы запускать ее копию.
Код: plaintext
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.
bool ReLoad(){
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      memset(&si,  0 , sizeof(STARTUPINFO));
      si.cb = sizeof(STARTUPINFO);
      AnsiString AppName=ParamStr( 0 )+ " -r" ;
      CreateProcess(NULL,AppName.c_str(), NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
      PostQuitMessage( 0 );
      return true;
}
// --------------------------------------------
 
bool __fastcall TForm1::HM(TMessage &Message){
  switch (Message.Msg)
   {
      case WM_DESTROY :{ReLoad();
                         return true;                          };
     default: break;
   }

  return false;
};
// ----------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Application->HookMainWindow(HM);
}
все работает но только еслизакрывать приложение, а не завершать процесс(Win 2k) если завершается процесс то программа никакого сообщения не получает ... по крайней мере у меня :((

3) зделать что то наподобие IB сервера когда запускаются 2 приложения и в случае если одно зависает или закрывается второе его перезапускает. ... этот метод мне кажется достаточно гемогойным чтоб прибегать к нему в крайнем случае.

И так вопрос у меня следующий. Или подскажите где в вышеперечисленных способах (в реализациях) я ошибся или подскажите любой другой способ который был бы проше чем описанный мною под №3.

заранее благодарен всем кто откликнется.
...
Рейтинг: 0 / 0
11.09.2003, 21:16
    #32262973
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Ну поскольку никто так и не откликнулся, а заходы в тему были, что можно расценить как интерес к теме, напишу ответ сам.

Так вот третий способ получился не таким уж и геморойным и даже приведу работающий пример.

файл u_Main.h
Код: plaintext
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.
38.
39.
40.
// ---------------------------------------------------------------------------
 

#ifndef u_MainH
#define u_MainH
// ---------------------------------------------------------------------------
 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
// ---------------------------------------------------------------------------
 
class Tf_Main : public TForm
{
__published:	// IDE-managed Components
        TClientSocket *cs_Guard;
        TServerSocket *ss_Guard;
        TButton *Button3;
        void __fastcall cs_GuardError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
          int &ErrorCode);
        void __fastcall cs_GuardDisconnect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall ss_GuardClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall Button3Click(TObject *Sender);
private:	// User declarations
        bool MustRestart; // true - перезапускать второе приложение если его закрыли 
public:		// User declarations
        __fastcall Tf_Main(TComponent* Owner);
};
// ---------------------------------------------------------------------------
 
extern PACKAGE Tf_Main *f_Main;
// ---------------------------------------------------------------------------
 
#endif


файл u_Main.cpp
Код: plaintext
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
// ---------------------------------------------------------------------------
 

#include <vcl.h>
#pragma hdrstop

#include  "u_Main.h" 
// ---------------------------------------------------------------------------
 
#pragma package(smart_init)
#pragma resource  "*.dfm" 
Tf_Main *f_Main;
// ---------------------------------------------------------------------------
 
bool reLoad(AnsiString runType){
// функция запускает еще одну копию программы с параметром runType
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  memset(&si,  0 , sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  AnsiString AppName=ParamStr( 0 )+ " " +runType;
  CreateProcess(NULL,AppName.c_str(), NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS , NULL, NULL, &si, &pi);
  return true;
};
// ---------------------------------------------------------------------------
 
__fastcall Tf_Main::Tf_Main(TComponent* Owner)
        : TForm(Owner)
{
  if(!ParamCount()){
   // если программа запущена без параметров
   reLoad( "667 ");// запускаем еще одну копию программы
   Application->Terminate();// закрываем эту копию программы (это сделано потому что мне надо было чтоб программа запускалась из батника и не тормазила его)
  }else{
//      Caption= "-c" ;// в заголловке окна показываем тип открываемого сокета
      cs_Guard->Port=StrToInt(ParamStr( 1 ));// параметром передается № порта на котором открывать соединение
      cs_Guard->Active=true;// активируем клиентский сокет
  };
  MustRestart=true;// устанавливаем флаг что приложение должно открывать копию если её закрыли
}
// ---------------------------------------------------------------------------
 
void __fastcall Tf_Main::cs_GuardError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
 // клиентским сокетом не удалось установить соединение (серверный небыл открыт)
 ErrorCode= 0 ;// говорим что ненадо паниковать и возбуждать исключение
 ss_Guard->Active=true;// открываем серверный сокет (на  677  порту)
// Caption= "-s" ; //в заголловке окна показываем тип открываемого сокета
 if(MustRestart){
   reLoad(IntToStr(ss_Guard->Port));//запускаем копию программы
 };
}
// ---------------------------------------------------------------------------
 
void __fastcall Tf_Main::cs_GuardDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
 // на клиентском сокете разорвалось соединение (программу с серверным сокетом закрыли)
 if(cs_Guard->Port== 667 ){//изменяем № рабочего порта
   ss_Guard->Port= 668 ;   //зделано из за того что серверный сокет открывается и закрывается
 }else{                  //достаточно долго и серверный сокет уже закрытой копии программы
   ss_Guard->Port= 667 ;   //виндоза считает еще сушествующим и недает на нем открыться
 };
 ss_Guard->Active=true;// активируем серверный сокет
// Caption= "-s" ;//;в заголловке окна показываем тип открываемого сокета
 if(MustRestart){
   reLoad(IntToStr(ss_Guard->Port));//запускаем вторую копию
 };
}
// ---------------------------------------------------------------------------
 
void __fastcall Tf_Main::ss_GuardClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
 // разорвано соединение на серверном сокете (вторая копия программы с клиентским сокетом была закрыта)
 if(MustRestart){
   reLoad(IntToStr(ss_Guard->Port)); // запускаем вторуб копию программы
 };
}
// ---------------------------------------------------------------------------
 
void __fastcall Tf_Main::Button3Click(TObject *Sender)
{
   MustRestart=false; //в процессе отладки должна бвть возможность закрыть приложение
}                     //а потому добавлена кнопка, надавив на которую в обеих копиях программы
                      //делаем программу закрываемой
//---------------------------------------------------------------------------


конечно это не проект целиком, но если кто не сможет самостоятельно добавить остальное, то он залез не в тот форум.
...
Рейтинг: 0 / 0
12.09.2003, 12:49
    #32263557
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Интересно было бы посмотреть на процесс Shutdown системы с такой программкой. Думаю, задауняется, но драчка процессов будет неслабая :-)
...
Рейтинг: 0 / 0
15.09.2003, 10:10
    #32264763
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Воможно драчка и есть ... даже скорее всего, но процесс выключения занимает нчуть не больше времени чем когда эта прорграмулина не запущена ;))
...
Рейтинг: 0 / 0
16.09.2003, 13:42
    #32266395
keisik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Хм. А что помешает программно открыть оба процесса и завалить их одновременно?
...
Рейтинг: 0 / 0
16.09.2003, 14:41
    #32266565
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Дело в том, что закрытие программы процесс, также занимающий время. Посему есть ненулувая вероятность, что не сработает. Но вообще-то проще машину перезагрузить :-) В Safe mode :-)
...
Рейтинг: 0 / 0
16.09.2003, 17:55
    #32266948
keisik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Да, против лома нет приёма. :)
К тому же меня терзают смутные сомнения, что если срезать процесс, то подключенным сокетам придёт сообщение о разрыве связи.
...
Рейтинг: 0 / 0
16.09.2003, 19:21
    #32267027
123456789098
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать програмулину котрую нельзя было бы закрыть.
Ну написали много всего. и я как автор позволю себе подвести итог под всем этим. ;)

Значит так задача столя таким оброзом чтоб ПОЛЬЗОВАТЕЛЬ не смог закрыть программу (ключевое слово пользователь).
Исходя из этого могу сказать что простой смертный пользователь не сможет закрыть 2 процесса более менее одновременно, для этого надо писать программу, а это уже не пользователь.Да и кстати говоря если народу дать программу и не рассказать ее принципы работы, то не так уж и просто бывает решить что с ней делать. Второе программа запускается из скрипта входа в домен и следовательно перезагрузка ниче не даст. :)

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

На этом лично я думаю что тему можно закрыть, а всем кто принимал участие я очень благодарен.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите написать програмулину котрую нельзя было бы закрыть. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]