Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Блокировка


Автор: Lepricon 25.6.2003, 03:40
Привет Всем!!!
Столкнулся с такой проблемой...
Надо запретить запуск определённой прораммы, вернее запускать её под паролем...
Есть список программ, необходимо, чтобы при запуске хотя бы одной выскакивало окошко с запросом пароля, и без пароля прорамма не запускалась...
Причём это всё должно работать как под win98 так и под win2000...
Подскажите как это реализовать...
Проблема в том как отслеживать сам факт запуска программы...
и если программа написана как сервис, как её правильно установить, чтоб запускалась автоматически при загрузке... и для win2000 с системными привилегиями...
Если есть готовые решения, подскажите где можно найти...

Автор: <Spawn> 25.6.2003, 09:13
Наверна нужно юзать хук с WH_CBT или WH_SHELL.

Автор: Mikel 25.6.2003, 17:13
WH_CBT лучше- там просто результат поставишь в 1 и прога не будет запущена. В wParam там сидит hWnd главного окна.

Автор: Lepricon 26.6.2003, 03:06
А можно поподробнее пожалуйста...

Автор: Mikel 26.6.2003, 16:47
Вот писал когда-то
Библиотека:
Код
library CBT;

uses
 SysUtils,
 Windows;

const
 MMFName:PChar='HookData';


type
 PGlobalDLLData=^TGlobalDLLData;
 TGlobalDLLData=packed record
   SysHook:HWND;
   MyAppWnd:HWND;
 end;

var
 GlobalData:PGlobalDLLData;
 MMFHandle:THandle;

function CBTProc(code:integer;wParam:wParam;lParam:lParam):longint;stdcall;
Var B:Array [0..8191]of Char;
   WndClass,WndName,
   DisClasses,DisNames:String;
   h:hWnd;
   n:integer;
begin
 n:=0;
 if code < 0 then
 begin
   Result:=CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam);
   Exit;
 end;

 if (code=HCBT_ACTIVATE)
    or(code=HCBT_CREATEWND)
    or(code=HCBT_DESTROYWND)
    or(code=HCBT_MINMAX)
    or(code=HCBT_MOVESIZE)
    or(code=HCBT_SETFOCUS)
    or(code=HCBT_SYSCOMMAND)
    then begin
           ZeroMemory(@B,SizeOf(B));
           GetClassName(wParam,@b,8191);
           WndClass:=StrPas(@b);
           ZeroMemory(@B,SizeOf(B));
           GetWindowText(wParam,@b,8191);
           WndName:=StrPas(@b);

           if (WndClass=#32770)
              or(WndClass='Notepad')
              or(WndClass='IEFrame')
              then n:=1
              else n:=0;
         end;


 CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam);
 Result:= n;
end;

procedure hook(switch:Boolean;hMainProg:HWND) export; stdcall;
begin
 if switch=true then
 begin
   GlobalData^.SysHook := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
   GlobalData^.MyAppWnd:= hMainProg;
 end
 else
   begin
   UnhookWindowsHookEx(GlobalData^.SysHook);
   end;
end;

procedure OpenGlobalData;
begin
 MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE,0,SizeOf(TGlobalDLLData),MMFName);
 GlobalData:= MapViewOfFile(MMFHandle,FILE_MAP_ALL_ACCESS,0,0,SizeOf(TGlobalDLLData));
 if GlobalData=nil then
   begin
     CloseHandle(MMFHandle);
     Exit;
   end;

end;

procedure CloseGlobalData;
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;
 end;
end;

exports hook;

begin
 DLLProc:= @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


И прога
Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Timer1Timer(Sender: TObject);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 hDLL: THandle;

implementation

{$R *.DFM}
procedure Init;
var
 Hook: procedure (switch:Boolean;hMainProg:HWND) stdcall;
begin
 @hook:= nil;
 hDLL:=LoadLibrary(PChar('CBT.dll'));
 if hDLL > HINSTANCE_ERROR then
   begin
     @hook:=GetProcAddress(Hdll, 'hook');
     hook(true, Form1.Handle);
   end
 else
 begin
   ShowMessage('Хрен тебе!');
   Exit;
 end;

end;

procedure Destroyhook;
var
 Hook: procedure (switch:Boolean;hMainProg:HWND) stdcall;
begin
 @hook:= nil;
 if hDLL > HINSTANCE_ERROR then
   begin
     @hook:=GetProcAddress(Hdll,'hook');
     hook(false, Form1.Handle);
     if FreeLibrary(hDLL)
        then sleep(100)
        else begin
               ShowMessage('Хрен тебе!');
               Exit;
             end;
   end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
freelibrary(hDLL);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=FALSE;
Init;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
DestroyHook;
end;

end.


Подгони просто под свои нужды. У меня она прикрывала блокнот, експлорер и диалоги виндовские.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)