Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

КАК Запретить запуск чужой программы более N раз?   Найти похожие ветки 

 
Freestyler   (2004-01-24 03:28) [0]

Значит работаю через Hook
WH_CBT
ловлю   HCBT_CREATEWND:
и  HCBT_DESTROYWND
так вот: если в  HCBT_DESTROYWND я делаю вот так:
         If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
       Result:= 12345
то ворд естественно не запускается...
а вот если делаю так:
s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
   for i:=1 to arrCount do
       if fn[i]=s Then
         Begin
           CONT[i]:=CONT[i]+1;
           If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
         end;

то все виснет :( ...
масив cont - количество запусков проги
tot - макс количество запусков проги
fn - имя проги....

текст процедуры такой:
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
f: TextFile;
windtext, windir: array [0..255] of char;
s,Filedir,str:String;
i:integer;
begin
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
case code of
 HCBT_CREATEWND:
  begin
   Str:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
   if Str="" then exit;
   if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent<>0 then exit;

       Wnd := wParam;
   GetWindowText(Wnd, windtext, 255);
{s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>0 then
   for i:=1 to arrCount do
       if fn[i]=s Then
         Begin
           CONT[i]:=CONT[i]+1;
           If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
         end;
               
  end;

 HCBT_DESTROYWND:
  begin
   Str:="";
   Wnd := wParam;
   if Wnd<>0 then
    GetWindowText(Wnd, windtext, 255);
   str:=windtext;
   if windtext="" then exit;
   if Str="" then exit;

s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>0 then
   for i:=1 to arrCount do
       if fn[i]=s Then
         Begin
           CONT[i]:=CONT[i]-1;
         end;

     end;
end;
end;


 
Freestyler   (2004-01-24 03:30) [1]

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


 
Freestyler   (2004-01-24 03:41) [2]

Сорри, вот этот в пункте о ворде должен не HCBT_DESTROYWND, а HCBT_CREATEWND
"так вот: если в  HCBT_CREATEWND я делаю вот так:
        If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
      Result:= 12345 то ворд естественно не запускается...
а вот если делаю так:
s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
  for i:=1 to arrCount do
      if fn[i]=s Then
        Begin
          CONT[i]:=CONT[i]+1;
          If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
        end;
то все виснет :( ..."


 
Digitman ©   (2004-01-24 15:45) [3]

виснет это или не виснет - другой вопрос ... но здесь нет даже ни намека именно на запрет запуска ворда


 
Freestyler   (2004-01-24 22:22) [4]

да нет... запретить запустить ворд я могу:
вот таким способом:
        If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
      Result:= 12345

(по доке если result<>0 то отбой...)
это работает...
но вот когда я в циклу перебираю значения (какая программа запускается),

s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
 for i:=1 to arrCount do
     if fn[i]=s Then
       Begin
         CONT[i]:=CONT[i]+1;
         If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
       end;


то вот тут все и виснет...


 
Digitman ©   (2004-01-26 08:25) [5]


> запретить запустить ворд я могу


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


 
Freestyler   (2004-01-27 02:32) [6]

:(
ну а как тогда лучше отлавливать запус программы и запретить запускать ее?
читал о хуке на WH_SHELL так там тоже отлавливается только создание ТОП окна (верхнего)...
или я ошибаюсь?
вот уже несколько дней бьюсь... помогите пожалуйста


 
Digitman ©   (2004-01-27 08:08) [7]

глоб.хук здесь вообще не поможет
такая задача решаема только с помощью kernel-mode драйвера


 
GrayFace ©   (2004-01-27 16:02) [8]

Смотри у окна ProcessID, потом OpenProcess и terminate. Можешь хранить список процессов, чтобы не закрывать лишнего. Только terminate - это не очень хорошо, т.к. там вроде память загрязняется.


 
Freestyler   (2004-01-27 22:02) [9]

спасибо, попробую ;)


 
Freestyler   (2004-01-27 22:05) [10]

А что на это все скажет господин Зотов?
Может есть какой вариант отследить запуск процесса?


 
Freestyler   (2004-01-31 00:39) [11]

А как запретить запускать DOS приложение?
Я так понимаю, окно не создается, когда приложение в полноекранном режиме, или я ошибаюсь?


 
GrayFace ©   (2004-01-31 13:35) [12]

В NT DOS прога - это окно. В 98 не знаю. В NT бери командную строку окон проги cmd.exe и по ней определяй запускаемую.


 
Freestyler   (2004-02-02 22:31) [13]

хммм....
придется поизвращться :)


 
Freestyler   (2004-02-15 00:38) [14]

хмм... дело в том, что до закрытия этого окна программа может сделать какое то действие (ну например пооткрывать ДБФ файлы и индексы)... Если ее теперь вот так закрыть, то индексы полетят нафиг... а это не есть гуд.
А можно как-то вообще не дать запуститься этому процессу? (тоесть отлавливать момент запуска и там позволять или запрещать старт этого процесса)



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
6-1076661575
bykopor
2004-02-13 11:39
2004.04.18
INDY, компонент TCP/IP


4-1076419821
Islander
2004-02-10 16:30
2004.04.18
Вставить текст из буфера в чужое приложение


3-1078829501
Rauf
2004-03-09 13:51
2004.04.18
Проблема Юникода в запросе SQL


1-1080333572
alienserg
2004-03-26 23:39
2004.04.18
отладка сервиса. Как?


4-1076427450
Morg
2004-02-10 18:37
2004.04.18
два exe файла в одном