Форум: "Сети";
Текущий архив: 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