Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
4-72593
Lipa
2002-12-09 16:01
2003.01.23
О выключении компьотера.


4-72609
DAnton
2002-12-05 15:10
2003.01.23
SetLocalTime?


7-72554
BJValentine
2002-11-12 18:58
2003.01.23
Прога - невидимка


3-72119
Vadim
2002-12-28 01:02
2003.01.23
MySql и Delphi7


14-72520
Дмитрий К.К.
2002-12-20 06:40
2003.01.23
Посвящается модераторам...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский