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

Вниз

IS филтры   Найти похожие ветки 

 
Walker ©   (2002-11-17 02:40) [0]

Как програмно добавить (удалить) фильтр к Интернет Серверу (конкретно в Win2000)?

Как програмно перезапустить IS?

Желательно используя ISAPI или другие средства БЕЗ VCL подобных компонентов.


 
Walker ©   (2002-11-18 02:47) [1]

Не ужель никто не знает?


 
darkbear ©   (2002-11-20 12:32) [2]

Видел вроде ответ на такой вопрос на delphi3000.com
Там был пример... разбирать его не разбирал


 
Оливейра ©   (2002-11-21 01:49) [3]

IIS как и вся Win - набор коклассов и интерфейсов, и соответсвтенно подлежит автоматизации. Сам не ковырял, но MSDN ссылается на "IIS SDK documentation" (поищи там)

Перезапустить его можно как сервис (OpenService etc.)


 
Walker ©   (2002-11-21 11:34) [4]

MSDN нету... товарищи, может всё-таки кто-нибудь сталкивался с такой задачей?


 
darkbear ©   (2002-11-26 11:15) [5]

Вот советовал же тебе посетить Delphi3000, вот от туда пример загрузки фильтра без перезапуска IIS

Часть 1.

FilterLoader.dpr
library FilterLoader;
uses
ISAPI2,
Windows,
EggFilterLoader;
{$R *.RES}
var
GEggFilterLoader: IEggFilterLoader = nil;

function GetFilterVersion(var pVer: HTTP_FILTER_VERSION): BOOL; export; stdcall;
begin
try
GEggFilterLoader:= nil;
GEggFilterLoader:= CoCreateEggFilterLoader;
Result:= GEggFilterLoader.GetFilterVersion(pVer);
except
Result:= False;
end;
end;

function HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT;
NotificationType: DWORD;
pvNotification: Pointer): DWORD; export; stdcall;
begin
try
Result:= GEggFilterLoader.HttpFilterProc(pfc, NotificationType, pvNotification);
except
Result:= SF_STATUS_REQ_NEXT_NOTIFICATION;
end;
end;

exports
GetFilterVersion,
HttpFilterProc;

begin
end.


 
darkbear ©   (2002-11-26 11:17) [6]

Часть 2.


EggFilterLoader.pas
unit EggFilterLoader;
interface
uses
ISAPI2,
Fn_GetModuleName,
SysUtils,
Windows;

type
IEggFilterLoader = interface
function GetFilterVersion(var pVer: HTTP_FILTER_VERSION): BOOL;
function HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT;
NotificationType: DWORD;
pvNotification: Pointer): DWORD;
end;

function CoCreateEggFilterLoader: IEggFilterLoader;

implementation
const
WAIT_BEFORE_CHECK = 10000;
SF_NOTIFY_SEND_RESPONSE = $00000040;
SF_NOTIFY_END_OF_REQUEST = $00000080;
ALL_FLAGS =
// SF_NOTIFY_READ_RAW_DATA
{or} SF_NOTIFY_PREPROC_HEADERS
or SF_NOTIFY_URL_MAP
or SF_NOTIFY_AUTHENTICATION
or SF_NOTIFY_ACCESS_DENIED
or SF_NOTIFY_SEND_RESPONSE
// or SF_NOTIFY_SEND_RAW_DATA
or SF_NOTIFY_END_OF_REQUEST
or SF_NOTIFY_LOG
or SF_NOTIFY_END_OF_NET_SESSION
or SF_NOTIFY_ORDER_DEFAULT
or SF_NOTIFY_SECURE_PORT
or SF_NOTIFY_NONSECURE_PORT;


type
TEggFilterLoader = class(TInterfacedObject, IEggFilterLoader)
private
FLastTimeCheck: LongWord;
FCheckSync: TMultiReadExclusiveWriteSynchronizer;
FDLLSync: TMultiReadExclusiveWriteSynchronizer;
FDLL: HModule;
FCallbackVersion: TGetFilterVersion;
FCallbackProc: THttpFilterProc;
FBackupDLLName, FRunDLLName, FUpdateDLLName: string;
FFilterFlags: DWord;
procedure ReloadDLL;
procedure DoUpdateIfNeeded;
public
constructor Create;
destructor Destroy; override;
function GetFilterVersion(var pVer: HTTP_FILTER_VERSION): BOOL;
function HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT;
NotificationType: DWORD;
pvNotification: Pointer): DWORD;
end;

function CoCreateEggFilterLoader: IEggFilterLoader;
begin
Result:= TEggFilterLoader.Create;
end;





 
darkbear ©   (2002-11-26 11:17) [7]

Часть 3.

constructor TEggFilterLoader.Create;
var
ThisModule: string;
begin
inherited Create;
FDLLSync:= TMultiReadExclusiveWriteSynchronizer.Create;
FCheckSync:= TMultiReadExclusiveWriteSynchronizer.Create;
ThisModule:= GetModuleName;
FBackupDLLName:= ChangeFileExt(ThisModule, ".backup");
FRunDLLName:= ChangeFileExt(ThisModule, ".run");
FUpdateDLLName:= ChangeFileExt(ThisModule, ".update");
end;

destructor TEggFilterLoader.Destroy;
begin
if FDLL <> 0 then
FreeLibrary(FDLL);
FDLLSync.Free;
FCheckSync.Free;
inherited;
end;

procedure TEggFilterLoader.DoUpdateIfNeeded;
var
NeedCheck, NeedLoad: Boolean;
begin
// Quick Check
FCheckSync.BeginRead;
try
NeedCheck:= (GetTickCount - FLastTimeCheck) >= WAIT_BEFORE_CHECK;
finally
FCheckSync.EndRead;
end;

if NeedCheck then
begin
FCheckSync.BeginWrite;
try
// Recheck in case another thread has updated
FDLLSync.BeginRead;
try
NeedCheck:= (FDLL=0) or ((GetTickCount - FLastTimeCheck) >= WAIT_BEFORE_CHECK);
finally
FDLLSync.EndRead;
end;

if NeedCheck then
begin
FLastTimeCheck:= GetTickCount;
FDLLSync.BeginRead;
try
NeedLoad:= (FDLL=0) or FileExists(FUpdateDLLName);
finally
FDLLSync.EndRead;
end;
if NeedLoad then
ReloadDLL;
end;
finally
FCheckSync.EndWrite;
end;
end;
end;

function TEggFilterLoader.GetFilterVersion(
var pVer: HTTP_FILTER_VERSION): BOOL;
begin
DoUpdateIfNeeded;
FDLLSync.BeginRead;
try
pVer.dwFilterVersion:= MakeLong(0, 1);
pVer.lpszFilterDesc:= "Eggcentric Filter Loader.";
pVer.dwFlags:= ALL_FLAGS;
Result:= True;
finally
FDLLSync.EndRead;
end;
end;

function TEggFilterLoader.HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT;
NotificationType: DWORD; pvNotification: Pointer): DWORD;
begin
DoUpdateIfNeeded;
FDLLSync.BeginRead;
try
if Assigned(FCallbackProc) and ((NotificationType and FFilterFlags) <> 0) then
Result:= FCallbackProc(pfc, NotificationType, pvNotification)
else
Result:= SF_STATUS_REQ_NEXT_NOTIFICATION;
finally
FDLLSync.EndRead;
end;
end;

procedure TEggFilterLoader.ReloadDLL;
var
ShouldReload: Boolean;
pVer: THTTP_FILTER_VERSION;
begin
FDLLSync.BeginWrite;
try
ShouldReload:= (FDLL=0) or FileExists(FUpdateDLLName);
if ShouldReload then
begin
if FDLL <> 0 then
begin
FreeLibrary(FDLL);
FDLL:= 0;
FCallbackVersion:= nil;
FCallbackProc:= nil;
end;

if FileExists(FUpdateDLLName) then
begin
SysUtils.DeleteFile(FBackupDLLName);
RenameFile(FRunDLLName, FBackupDLLName);
RenameFile(FUpdateDLLName, FRunDLLName);
end;

if FileExists(FRunDLLName) then
begin
FDLL:= LoadLibrary(PChar(FRunDLLName));
if FDLL <> 0 then
begin
FCallbackVersion:= GetProcAddress(FDLL, "GetFilterVersion");
FCallbackProc:= GetProcAddress(FDLL, "HttpFilterProc");
if Assigned(FCallbackVersion) then
begin
FCallbackVersion(pVer);
FFilterFlags:= pVer.dwFlags;
end
else
FFilterFlags:= 0;
end;
end;
end;
finally
FDLLSync.EndWrite;
end;
end;

end.


 
darkbear ©   (2002-11-26 11:18) [8]

Часть 4.

Fn_GetModuleName.pas
unit Fn_GetModuleName;
{
Author
William Egge
egge@eggcentric.com

Version 1.0
Original FileName Fn_GetModuleName.pas
Date: Sep 9, 2001
Website http://www.eggcentric.com
This source code is free to distribute and modify.

Very simple function, it returns the full path and file name of the module
it is running in.
}


interface
uses
Windows;

function GetModuleName: string;

implementation

function GetModuleName: string;
var
FileName : array[0..MAX_PATH] of char;
begin
FillChar(FileName, SizeOf(FileName), #0);
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
Result:= FileName;
end;

end.



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
7-72547
Геннадий
2002-11-11 16:29
2003.01.23
Как перехватить сообщение, посланное конкретному Control у?


14-72470
RV
2003-01-05 09:52
2003.01.23
Дайте ссылку на программу или саму программу API_mon


3-72062
shel
2003-01-04 04:35
2003.01.23
Как отобразить в TDBImage blob поле(access)


1-72401
MyNameIsVova
2003-01-13 17:13
2003.01.23
Координаты курсора мыши.


14-72503
Jeka
2003-01-05 08:12
2003.01.23
language