unit DnldSkinUnit; interface uses windows, comobj, activex, shdocvw, mshtml,dialogs,PSock,NMHTTP; type TDnldSkinfactory = class(tcomobjectfactory) public procedure updateregistry(register: boolean); override; end; TDnldSkin = class(TComobject, IDispatch, IObjectwithsite) public function gettypeinfocount(out count: integer): hresult; stdcall; function gettypeinfo(index, localeid: integer; out typeinfo): hresult; stdcall; function getidsofnames(const iid: tguid; names: pointer; namecount, localeid: integer; dispids: pointer): hresult; stdcall; function invoke(dispid: integer; const iid: tguid; localeid: integer; flags: word; var params; varresult, excepinfo, argerr: pointer): hresult; stdcall; function setsite(const punksite: iunknown): hresult; stdcall; function getsite(const riid: tiid; out site: iunknown): hresult; stdcall; private ie: iwebbrowser2; cookie: integer; end; const class_DnldSkin: tguid = '{13028081-882B-11D5-AD38-00105A758028}'; HostName:String='127.0.0.1'; InstallDir:String='C:\Program Files\myskin\'; implementation uses comserv, registry, sysutils; procedure dostatustextchange(const text: widestring); begin end; procedure doprogresschange(progress: integer; progressmax: integer); begin end; procedure docommandstatechange(command: integer; enable: wordbool); begin end; procedure dodownloadbegin; begin end; procedure dodownloadcomplete; begin end; procedure dotitlechange(const text: widestring); begin end; procedure dopropertychange(const szproperty: widestring); begin end; procedure dobeforenavigate2(const pdisp: idispatch; var url: olevariant; var flags: olevariant; var targetframename: olevariant; var postdata: olevariant; var headers: olevariant; var cancel: wordbool); var DHTTP:TNMHTTP; ProxyServer,TempStr:String; ProxyEnable:integer; begin if Pos('/myskin/',url)>0 then begin showmessage('正在下载Skin,请稍候...'); // Screen.Cursor:=crHourGlass; with TRegistry.Create do begin RootKey:=HKEY_CURRENT_USER; OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings',False); ProxyServer:=ReadString('ProxyServer'); ProxyEnable:=ReadInteger('ProxyEnable'); Free; end; try DHTTP:=TNMHTTP.Create(nil); DHTTP.Host:=HostName; DHTTP.Port:=80; DHTTP.InputFileMode:=True; if (ProxyServer<>'') and (ProxyEnable=1) then begin if Pos('http=',ProxyServer)>0 then TempStr:=Copy(ProxyServer,Pos('http=',ProxyServer)+5,Length(ProxyServer)) else TempStr:=ProxyServer; if Pos(';',TempStr)>0 then TempStr:=Copy(TempStr,1,Pos(';',TempStr)-1); DHTTP.Proxy:=Copy(TempStr,1,Pos(':',TempStr)-1); DHTTP.ProxyPort:=StrToInt(Copy(TempStr,Pos(':',TempStr)+1,Length(TempStr))); end; DHTTP.Header:=InstallDir+'Head.txt'; DHTTP.Body:=InstallDir+'BackGround.bmp'; DHTTP.Get(Url+'.bmp'); DHTTP.Free; except Showmessage('下载Skin失败'); end; // Screen.Cursor:=crArrow; WinExec(PChar('c:\progra~1\Intern~1\Iexplore Http://www.caramella.com.cn'),SW_SHOW); cancel:=true; // url:='http://www.applevb.com'; // (pdisp as iwebbrowser2).navigate2(url,flags,targetframename,postdata,headers); end; end; procedure donewwindow2(var ppdisp: idispatch; var cancel: wordbool); begin end; procedure donavigatecomplete2(const pdisp: idispatch; var url: olevariant); begin end; procedure dodocumentcomplete(const pdisp: idispatch; var url: olevariant); begin end; procedure doonquit; begin end; procedure doonvisible(visible: wordbool); begin end; procedure doontoolbar(toolbar: wordbool); begin end; procedure doonmenubar(menubar: wordbool); begin end; procedure doonstatusbar(statusbar: wordbool); begin end; procedure doonfullscreen(fullscreen: wordbool); begin end; procedure doontheatermode(theatermode: wordbool); begin end; procedure buildpositionaldispids(pdispids: pdispidlist; const dps: tdispparams); var i: integer; begin assert(pdispids <> nil); for i := 0 to dps.cargs - 1 do pdispids^[i] := dps.cargs - 1 - i; if (dps.cnamedargs <= 0) then exit; for i := 0 to dps.cnamedargs - 1 do pdispids^[dps.rgdispidnamedargs^[i]] := i; end;
function tDnldSkin.invoke(dispid: integer; const iid: tguid; localeid: integer; flags: word; var params; varresult, excepinfo, argerr: pointer): hresult; type polevariant = ^olevariant; var dps: tdispparams absolute params; bhasparams: boolean; pdispids: pdispidlist; idispidssize: integer; begin result := disp_e_membernotfound; pdispids := nil; idispidssize := 0; bhasparams := (dps.cargs > 0); if (bhasparams) then begin idispidssize := dps.cargs * sizeof(tdispid); getmem(pdispids, idispidssize); end; try if (bhasparams) then buildpositionaldispids(pdispids, dps); case dispid of 102: begin dostatustextchange(dps.rgvarg^[pdispids^[0]].bstrval); result := s_ok; end; 108: begin doprogresschange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].lval); result := s_ok; end; 105: begin docommandstatechange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].vbool); result := s_ok; end; 106: begin dodownloadbegin(); result := s_ok; end; 104: begin dodownloadcomplete(); result := s_ok; end; 113: begin dotitlechange(dps.rgvarg^[pdispids^[0]].bstrval); result := s_ok; end; 112: begin dopropertychange(dps.rgvarg^[pdispids^[0]].bstrval); result := s_ok; end; 250: begin dobeforenavigate2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[2]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[3]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[4]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[5]].pvarval)^, dps.rgvarg^[pdispids^[6]].pbool^); result := s_ok; end; 251: begin donewwindow2(idispatch(dps.rgvarg^[pdispids^[0]].pdispval^), dps.rgvarg^[pdispids^[1]].pbool^); result := s_ok; end; 252: begin donavigatecomplete2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^); result := s_ok; end; 259: begin dodocumentcomplete(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^); result := s_ok; end; 253: begin doonquit(); result := s_ok; end; 254: begin doonvisible(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; 255: begin doontoolbar(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; 256: begin doonmenubar(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; 257: begin doonstatusbar(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; 258: begin doonfullscreen(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; 260: begin doontheatermode(dps.rgvarg^[pdispids^[0]].vbool); result := s_ok; end; end; finally if (bhasparams) then freemem(pdispids, idispidssize); end; end; function tDnldSkin.getidsofnames(const iid: tguid; names: pointer; namecount, localeid: integer; dispids: pointer): hresult; begin result := e_notimpl; end; function tDnldSkin.gettypeinfo(index, localeid: integer; out typeinfo): hresult; begin result := e_notimpl; pointer(typeinfo) := nil; end; function tDnldSkin.gettypeinfocount(out count: integer): hresult; begin result := e_notimpl; count := 0; end; function tDnldSkin.getsite(const riid: tiid; out site: iunknown): hresult; begin // result := s_ok; if assigned(ie) then result:=ie.queryinterface(riid, site) else result:= e_fail; end; function tDnldSkin.setsite(const punksite: iunknown): hresult; var cmdtarget: iolecommandtarget; sp: iserviceprovider; cpc: iconnectionpointcontainer; cp: iconnectionpoint; begin if assigned(punksite) then begin cmdtarget := punksite as iolecommandtarget; sp := cmdtarget as iserviceprovider; if assigned(sp)then sp.queryservice(iwebbrowserapp, iwebbrowser2, ie); if assigned(ie) then begin ie.queryinterface(iconnectionpointcontainer, cpc); cpc.findconnectionpoint(dwebbrowserevents2, cp); cp.advise(self, cookie) end; end; result := s_ok; end; procedure tDnldSkinfactory.updateregistry(register: boolean); var s: string; begin inherited updateregistry(register); if register then begin s := guidtostring(class_DnldSkin); with tregistry.create do try rootkey := hkey_local_machine; openkey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s, true); RootKey:=HKEY_CLASSES_ROOT; OpenKey('\CLSID\'+s,False); WriteString('','DnldSkin'); finally free; end; end else begin s := guidtostring(class_DnldSkin); with tregistry.create do try rootkey := hkey_local_machine; deletekey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s); finally free; end; end; end; initialization tDnldSkinfactory.create(comserver, tDnldSkin, class_DnldSkin, 'DnldSkin', '', cimultiinstance, tmapartment); end.
interface
uses
windows, comobj, activex, shdocvw, mshtml,dialogs,PSock,NMHTTP;
type
TDnldSkinfactory = class(tcomobjectfactory)
public
procedure updateregistry(register: boolean); override;
end;
TDnldSkin = class(TComobject, IDispatch, IObjectwithsite)
public
function gettypeinfocount(out count: integer): hresult; stdcall;
function gettypeinfo(index, localeid: integer; out typeinfo): hresult; stdcall;
function getidsofnames(const iid: tguid; names: pointer;
namecount, localeid: integer; dispids: pointer): hresult; stdcall;
function invoke(dispid: integer; const iid: tguid; localeid: integer;
flags: word; var params; varresult, excepinfo, argerr: pointer): hresult; stdcall;
function setsite(const punksite: iunknown): hresult; stdcall;
function getsite(const riid: tiid; out site: iunknown): hresult; stdcall;
private
ie: iwebbrowser2;
cookie: integer;
end;
const
class_DnldSkin: tguid = '{13028081-882B-11D5-AD38-00105A758028}';
HostName:String='127.0.0.1';
InstallDir:String='C:\Program Files\myskin\';
implementation
uses comserv, registry, sysutils;
procedure dostatustextchange(const text: widestring);
begin
end;
procedure doprogresschange(progress: integer; progressmax: integer);
begin
end;
procedure docommandstatechange(command: integer; enable: wordbool);
begin
end;
procedure dodownloadbegin;
begin
end;
procedure dodownloadcomplete;
begin
end;
procedure dotitlechange(const text: widestring);
begin
end;
procedure dopropertychange(const szproperty: widestring);
begin
end;
procedure dobeforenavigate2(const pdisp: idispatch; var url: olevariant; var flags: olevariant; var targetframename: olevariant; var postdata: olevariant; var headers: olevariant; var cancel: wordbool);
var
DHTTP:TNMHTTP;
ProxyServer,TempStr:String;
ProxyEnable:integer;
begin
if Pos('/myskin/',url)>0 then
begin
showmessage('正在下载Skin,请稍候...');
// Screen.Cursor:=crHourGlass;
with TRegistry.Create do
begin
RootKey:=HKEY_CURRENT_USER;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings',False);
ProxyServer:=ReadString('ProxyServer');
ProxyEnable:=ReadInteger('ProxyEnable');
Free;
end;
try
DHTTP:=TNMHTTP.Create(nil);
DHTTP.Host:=HostName;
DHTTP.Port:=80;
DHTTP.InputFileMode:=True;
if (ProxyServer<>'') and (ProxyEnable=1) then
begin
if Pos('http=',ProxyServer)>0 then
TempStr:=Copy(ProxyServer,Pos('http=',ProxyServer)+5,Length(ProxyServer))
else
TempStr:=ProxyServer;
if Pos(';',TempStr)>0 then TempStr:=Copy(TempStr,1,Pos(';',TempStr)-1);
DHTTP.Proxy:=Copy(TempStr,1,Pos(':',TempStr)-1);
DHTTP.ProxyPort:=StrToInt(Copy(TempStr,Pos(':',TempStr)+1,Length(TempStr)));
end;
DHTTP.Header:=InstallDir+'Head.txt';
DHTTP.Body:=InstallDir+'BackGround.bmp';
DHTTP.Get(Url+'.bmp');
DHTTP.Free;
except
Showmessage('下载Skin失败');
end;
// Screen.Cursor:=crArrow;
WinExec(PChar('c:\progra~1\Intern~1\Iexplore Http://www.caramella.com.cn'),SW_SHOW);
cancel:=true;
// url:='http://www.applevb.com';
// (pdisp as iwebbrowser2).navigate2(url,flags,targetframename,postdata,headers);
end;
end;
procedure donewwindow2(var ppdisp: idispatch; var cancel: wordbool);
begin
end;
procedure donavigatecomplete2(const pdisp: idispatch; var url: olevariant);
begin
end;
procedure dodocumentcomplete(const pdisp: idispatch; var url: olevariant);
begin
end;
procedure doonquit;
begin
end;
procedure doonvisible(visible: wordbool);
begin
end;
procedure doontoolbar(toolbar: wordbool);
begin
end;
procedure doonmenubar(menubar: wordbool);
begin
end;
procedure doonstatusbar(statusbar: wordbool);
begin
end;
procedure doonfullscreen(fullscreen: wordbool);
begin
end;
procedure doontheatermode(theatermode: wordbool);
begin
end;
procedure buildpositionaldispids(pdispids: pdispidlist; const dps: tdispparams);
var
i: integer;
begin
assert(pdispids <> nil);
for i := 0 to dps.cargs - 1 do
pdispids^[i] := dps.cargs - 1 - i;
if (dps.cnamedargs <= 0) then exit;
for i := 0 to dps.cnamedargs - 1 do
pdispids^[dps.rgdispidnamedargs^[i]] := i;
end;
flags: word; var params; varresult, excepinfo, argerr: pointer): hresult;
type
polevariant = ^olevariant;
var
dps: tdispparams absolute params;
bhasparams: boolean;
pdispids: pdispidlist;
idispidssize: integer;
begin
result := disp_e_membernotfound;
pdispids := nil;
idispidssize := 0;
bhasparams := (dps.cargs > 0);
if (bhasparams) then
begin
idispidssize := dps.cargs * sizeof(tdispid);
getmem(pdispids, idispidssize);
end;
try
if (bhasparams) then buildpositionaldispids(pdispids, dps);
case dispid of
102:
begin
dostatustextchange(dps.rgvarg^[pdispids^[0]].bstrval);
result := s_ok;
end;
108:
begin
doprogresschange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].lval);
result := s_ok;
end;
105:
begin
docommandstatechange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].vbool);
result := s_ok;
end;
106:
begin
dodownloadbegin();
result := s_ok;
end;
104:
begin
dodownloadcomplete();
result := s_ok;
end;
113:
begin
dotitlechange(dps.rgvarg^[pdispids^[0]].bstrval);
result := s_ok;
end;
112:
begin
dopropertychange(dps.rgvarg^[pdispids^[0]].bstrval);
result := s_ok;
end;
250:
begin
dobeforenavigate2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[2]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[3]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[4]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[5]].pvarval)^, dps.rgvarg^[pdispids^[6]].pbool^);
result := s_ok;
end;
251:
begin
donewwindow2(idispatch(dps.rgvarg^[pdispids^[0]].pdispval^), dps.rgvarg^[pdispids^[1]].pbool^);
result := s_ok;
end;
252:
begin
donavigatecomplete2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);
result := s_ok;
end;
259:
begin
dodocumentcomplete(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);
result := s_ok;
end;
253:
begin
doonquit();
result := s_ok;
end;
254:
begin
doonvisible(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
255:
begin
doontoolbar(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
256:
begin
doonmenubar(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
257:
begin
doonstatusbar(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
258:
begin
doonfullscreen(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
260:
begin
doontheatermode(dps.rgvarg^[pdispids^[0]].vbool);
result := s_ok;
end;
end;
finally
if (bhasparams) then freemem(pdispids, idispidssize);
end;
end;
function tDnldSkin.getidsofnames(const iid: tguid; names: pointer;
namecount, localeid: integer; dispids: pointer): hresult;
begin
result := e_notimpl;
end;
function tDnldSkin.gettypeinfo(index, localeid: integer;
out typeinfo): hresult;
begin
result := e_notimpl;
pointer(typeinfo) := nil;
end;
function tDnldSkin.gettypeinfocount(out count: integer): hresult;
begin
result := e_notimpl;
count := 0;
end;
function tDnldSkin.getsite(const riid: tiid; out site: iunknown): hresult;
begin
// result := s_ok;
if assigned(ie) then result:=ie.queryinterface(riid, site)
else
result:= e_fail;
end;
function tDnldSkin.setsite(const punksite: iunknown): hresult;
var
cmdtarget: iolecommandtarget;
sp: iserviceprovider;
cpc: iconnectionpointcontainer;
cp: iconnectionpoint;
begin
if assigned(punksite) then begin
cmdtarget := punksite as iolecommandtarget;
sp := cmdtarget as iserviceprovider; if assigned(sp)then
sp.queryservice(iwebbrowserapp, iwebbrowser2, ie);
if assigned(ie) then begin
ie.queryinterface(iconnectionpointcontainer, cpc);
cpc.findconnectionpoint(dwebbrowserevents2, cp);
cp.advise(self, cookie)
end;
end;
result := s_ok;
end;
procedure tDnldSkinfactory.updateregistry(register: boolean);
var
s: string;
begin
inherited updateregistry(register);
if register then
begin
s := guidtostring(class_DnldSkin);
with tregistry.create do
try
rootkey := hkey_local_machine;
openkey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s, true);
RootKey:=HKEY_CLASSES_ROOT;
OpenKey('\CLSID\'+s,False);
WriteString('','DnldSkin');
finally
free;
end;
end
else
begin
s := guidtostring(class_DnldSkin);
with tregistry.create do
try
rootkey := hkey_local_machine;
deletekey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s);
finally
free;
end;
end;
end;
initialization
tDnldSkinfactory.create(comserver, tDnldSkin, class_DnldSkin,
'DnldSkin', '', cimultiinstance, tmapartment);
end.