powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите написать програмулину котрую нельзя было бы закрыть.
8 сообщений из 8, страница 1 из 1
Помогите написать програмулину котрую нельзя было бы закрыть.
    #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
Помогите написать програмулину котрую нельзя было бы закрыть.
    #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
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32263557
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно было бы посмотреть на процесс Shutdown системы с такой программкой. Думаю, задауняется, но драчка процессов будет неслабая :-)
...
Рейтинг: 0 / 0
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32264763
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воможно драчка и есть ... даже скорее всего, но процесс выключения занимает нчуть не больше времени чем когда эта прорграмулина не запущена ;))
...
Рейтинг: 0 / 0
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32266395
keisik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм. А что помешает программно открыть оба процесса и завалить их одновременно?
...
Рейтинг: 0 / 0
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32266565
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что закрытие программы процесс, также занимающий время. Посему есть ненулувая вероятность, что не сработает. Но вообще-то проще машину перезагрузить :-) В Safe mode :-)
...
Рейтинг: 0 / 0
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32266948
keisik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, против лома нет приёма. :)
К тому же меня терзают смутные сомнения, что если срезать процесс, то подключенным сокетам придёт сообщение о разрыве связи.
...
Рейтинг: 0 / 0
Помогите написать програмулину котрую нельзя было бы закрыть.
    #32267027
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну написали много всего. и я как автор позволю себе подвести итог под всем этим. ;)

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

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

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


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