|
|
|
|
Példaprogram letöltése
14447 bájt
|
Mellékelt példában olyan alkalmazást készítünk, mely képes arra, hogy figyelje és feljegyezze egy állományba, hogy a felhasználó az Internet Explorer-be milyen címeket ír be, vagyis merre barangol az interneten. Mindezt a tevékenységet úgy folytatja programunk, hogy a felhasználó elől teljesen rejtve maradjon az alkalmazásunk.
A mellékelt példa kipróbálásához a következő lépésekre van szükség:
- nyissa meg és fordítsa le a mellékelt BrowserSpy.dpr-t. (Project - Build)
- válassza a Run - Register ActiveX Server menüpontot
Ezzel a program működőképes lesz. Ha elindít ezek után egy Intézőt, vagy Internet Explorer-t, akkor a mellékelt program a c:\spy.txt szöveges állományba jegyzi fel, hogy mikor milyen alkönyvtárban, illetve web címen járt.
Ezt a tevékenységet megszüntetni a project megnyitása után a Run - UnRegister ActiveX Server menüpont választásával lehet.
Vegyük sorra most, hogy milyen lépések szükségesek egy ilyen alkalmazás elkészítéséhez.
Válasszuk a File - New menüpontot, majd az ActiveX lapon az ActiveX Library-t. Ekkor létre jön egy új DLL project-je. Mellékelt példában ez a BrowserSpy.dpr állomány.
Ehhez hozzá kell vennünk egy Automation Object-et. File - New menüpont, ActiveX lap Automation Object-re kattintva megjelenik az Automation Object Wizard ablaka. Itt választhatunk nevet az új, létrehozandó objektumunknak a CoClass Name ablakban. Mellékelt példában itt a BrowserSpyObject nevet adtuk. Az Ok gomb lenyomásakor létrejön egy új unit, ahol a BrowserSpyObject objektumot találjuk, valamint a project-hez kapunk egy Type Library-t is.
A BrowserSpyObject forráskódja (mellékelt példában Unit1.pas) ekkor még csak az alábbi deklarációt tartalmazza:
type
TBrowserSpyObject = class(TAutoObject, IBrowserSpyObject)
protected
{ Protected declarations }
end;
Ezt ki kell egészítenünk az alábbiak szerint:
type
TBrowserSpyObject = class(TAutoObject, IBrowserSpyObject,
IObjectWithSite, IDispatch)
protected
FWebBrowser: IWebBrowser2;
{IObjectWithSite}
function SetSite(const pUnkSite: IUnknown ):HResult; stdcall;
function GetSite(const riid: TIID; out site: IUnknown):
HResult; stdcall;
{IDispatch}
function Invoke(DispID: Integer; const IID: TGUID; LocaleID:
Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult; stdcall;
end;
Felvettük tehát az IObjectWithSite és az IDispatch interfészeket, valamint deklaráltuk a hozzájuk tartozó függvényeket. E kettő interfészre lesz szükségünk a programunk megvalósításához, de mielőtt ezt részleteznénk, tegyünk egy kis kitérőt és vizsgáljuk meg, hogy miként is fog működni alkalmazásunk.
A fenti módszerrel készített DLL osztály GUID azonosítóját, ha bejegyezzük a Windows regisztrációs adatbázisába a HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows\CurrentVersion\explorer\ Browser Helper Objects címre, akkor minden Internet Explorer, illetve Intéző indításakor automatikusan betöltődik a mi DLL-ünk is. Ettől kezdve nem csak felügyelhetjük e két program működését, mint jelen példánkban, hanem akár befolyásolhatjuk is azt.
A DLL regisztrálásakor (Run - Register ActiveX Server) fut le a project forráskódjában a begin end között elhelyezett kód. Ez a pillanat a legalkalmasabb arra, hogy a fenti Windows regisztrációs adatbázisba történő bejegyzést megtegyük.
var
Handle: HKey;
unused: integer;
begin
if RegCreateKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\
Microsoft\Windows\CurrentVersion\Explorer\Browser Helper
Objects\{E0EFEE9C-4AAB-49DB-B8E7-B25C48DE662E}', 0, '',
REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil,
Handle, @unused)=0 then begin
RegSetValueEx(Handle, PChar(''), 0, REG_SZ,
PChar('BrowserSpy'), Length('BrowserSpy') + 1);
RegCloseKey(Handle);
end;
end.
Tehát a SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects címre kell egy új alkulcsot létrehozni. Ennek neve a létrehozott objektumunk GUID-ja kell hogy legyen. Mivel ez minden alkalmazásnál egyedi, így ennek minden alkalommal utána kell néznünk. A kérdéses GUID-ot megtaláljuk a Type Library forráskódjában. A mellékelt példában a BrowserSpy_TLB.pas állomány 66. sorában található meg:
CLASS_BrowserSpyObject: TGUID =
'{E0EFEE9C-4AAB-49DB-B8E7-B25C48DE662E}';
Innen legegyszerűbb, ha átmásoljuk a {E0EFEE9C-4AAB-49DB-B8E7-B25C48DE662E} szöveget.
Miután létrehoztuk ezt a kulcsot tulajdonképpen meg is történt a szükséges regisztráció. Még esetleg egy nevet adhatunk az objektumunknak melyet szintén ide írunk be. Mellékelt példában ezt BrowserSpy-ra választottuk.
A Dll regisztrálásához használható a Run - Register ActiveX Server menüpont helyett a c:\Windows\System\regsvr32.exe segédprogram is, így nem szükséges a Delphi jelenléte azon a gépen, ahol installálni akarjuk a programunkat.
Kis kitérő után most térjünk vissza a Unit1.pas-hoz és nézzük miként is kell felhasználnunk az IObjectWithSite és az IDispatch interfészeket.
Az IObjectWithSite interfész GetSite függvényével jelen feladat miatt nincs dolgunk, így csak egy visszatérési értéket adunk neki.
function TBrowserSpyObject.GetSite(
const riid: TIID; out site: IUnknown): HResult;
begin
result:=S_OK;
end;
Ami számunkra fontosabb az a SetSite. Ez akkor kerül meghívásra, amikor a böngészőbe egy site kerül. Itt most annyi a teendőnk, hogy lekérdezzük és későbbi felhasználás végett eltároljuk az aktuális böngésző objektumát, mely nem más, mint egy IWebBrowser2 interfész.
Másik tennivaló, hogy kapcsolatot építsünk ki a böngésző és az alkalmazásunk között ahhoz, hogy értesülhessünk arról, ha a felhasználó új címet ír a böngészőbe. Ehhez az IConnectionPoint interfész Advise függvényét kell meghívnunk. Első paraméterként saját alkalmazásunkat kell átadnunk (Self) IDispatch interfészként deklarálva azt. Második paraméterbe visszatérési értéket kapunk, melyre most nincs szükségünk.
function TBrowserSpyObject.SetSite(const
pUnkSite: IUnknown): HResult;
var
cpc: IConnectionPointContainer;
cp: IConnectionPoint;
dwCookie: integer;
begin
if pUnkSite<>nil then begin
FWebBrowser:=pUnkSite as IWebBrowser2;
cpc:=FWebBrowser as IConnectionPointContainer;
cpc.FindConnectionPoint(DIID_DWebBrowserEvents2, cp);
cp.Advise(Self as IDispatch, dwCookie);
end;
result:=S_OK;
end;
Ezek után már az IDispatch Invoke függvénye meghívásra kerül amikor új cím kerül a böngészőbe.
Így az Invoke futásánál már csak ezt a címet kell megszereznünk a kapott paraméterekből, előtte azonban ellenőriznünk kell, hogy miért került meghívásra az Invoke. Ezt a DispID paraméterből tudhatjuk meg, ha ennek értéke egyezik a DISPID_NAVIGATECOMPLETE2 konstanssal, akkor biztosak lehetünk abban, hogy az adott böngészőbe írt címre már megérkezett a felhasználó. Ekkor megnyitjuk a spy.txt-t és a végéhez hozzáírjuk az aktuális időpontot, valamint a böngészőbe írt címet. Ez utóbbit úgy kapjuk meg, hogy a paraméterként kapott Params-ra rádefiniáljuk a TDispParams típust. Ennek van egy rgvarg nevű mezője, mely egy mutató egy tömbre. Ennek az első elemének pvarVal nevű mutatója pedig arra a sztringre mutat, amely érdekel bennünket, vagyis a böngészőbe írt címre.
function TBrowserSpyObject.Invoke(DispID: Integer; const IID:
TGUID; LocaleID: Integer; Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
st: TFileStream;
buffer: array[0..1023] of char;
s: string;
begin
result:=S_OK;
try
case DispID of
DISPID_NAVIGATECOMPLETE2: begin
try
st:=TFileStream.Create('c:\spy.txt', fmOpenReadWrite);
except
st:=TFileStream.Create('c:\spy.txt', fmCreate);
end;
st.Seek(0, soFromEnd);
s:=DateTimeToStr(Now)+' - '+TDispParams(Params).
rgvarg^[0].pvarVal^+#13#10;
StrPCopy(buffer, s);
st.Write(buffer, Length(s));
st.Free;
end;
end;
finally
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 40. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|