[英]How to find if an IHTMLDocument2 is equal to IDispatch document in Delphi?
[英]Silently block cookies warning with IHTMLDocument2 in Delphi
我正在使用IHTMLDocument2來抓取一組網站。 我正在創建IHTMLDocument2實例:
var
myDownload : TDownLoadURL;
doc: OleVariant;
(...)
myDownload:= TDownLoadURL.Create(nil);
with myDownload do
begin
URL:=myURL;
Filename:= GetTempDirectory+'temp_download_url_complete2.txt';
ExecuteTarget(nil);
end;
(...)
doc := coHTMLDocument.Create as IHTMLDocument2;
doc.write(html);
doc.close;
(...)
有一個特定的網站彈出一條消息:
允許本網站為您提供個性化信息,您是否允許它在您的計算機上放置一個小文件(稱為cookie)?
我已經改變了OS(Windows 2008 SE)Internet選項以在沒有提示的情況下阻止cookie,但是消息不斷出現。 如何在靜默模式下創建IHTMLDocument2?
如果需要禁止IHTMLDocument用戶界面或用戶通知,則需要實現IOleClientSite
和定義為DISPID_AMBIENT_DLCONTROL
的環境屬性。
從文檔“下載控制” :
主機可以通過實現IOleClientSite和定義為DISPID_AMBIENT_DLCONTROL的環境屬性來控制下載幀,圖像,Java等的某些方面。 當調用主機的IDispatch :: Invoke方法並將dispidMember設置為DISPID_AMBIENT_DLCONTROL時,它應該在pvarResult中放置零或以下值的組合。
在這種情況下,您需要的標志是DLCTL_SILENT
(也可能是DLCTL_NO_SCRIPTS
)。
如前所述,主機也應該實現IDispatch
( .Invoke
)和可選 IPropertyNotifySink
(或其他COM事件接收對象),如果你想從文件(如獲取事件通知DISPID_READYSTATE
為例)。
看看EmbeddedWB源代碼,看看它是如何實現的。 特別是IEParser.pas
和UI_Less.pas
。 它確實已經完全符合您的需求。
這是一個基於UI_Less
的簡化演示(沒有實現IPropertyNotifySink
):
uses ..., ActiveX, MSHTML;
const
DISPID_AMBIENT_DLCONTROL = (-5512);
type
TUILess = class(TComponent, IUnknown, IDispatch, IOleClientSite)
protected
// IDispatch
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT; stdcall;
// IOleClientSite
function SaveObject: HRESULT; stdcall;
function GetMoniker(dwAssign: Longint; dwWhichMoniker: Longint;
out mk: IMoniker): HRESULT; stdcall;
function GetContainer(out container: IOleContainer): HRESULT; stdcall;
function ShowObject: HRESULT; stdcall;
function OnShowWindow(fShow: BOOL): HRESULT; stdcall;
function RequestNewObjectLayout: HRESULT; stdcall;
end;
implementation
function TUILess.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT;
const
DLCTL_NO_SCRIPTS = $00000080;
DLCTL_NO_JAVA = $00000100;
DLCTL_NO_RUNACTIVEXCTLS = $00000200;
DLCTL_NO_DLACTIVEXCTLS = $00000400;
DLCTL_DOWNLOADONLY = $00000800;
DLCTL_SILENT = $40000000;
var
I: Integer;
begin
if DISPID_AMBIENT_DLCONTROL = DispID then
begin
I := DLCTL_DOWNLOADONLY + DLCTL_NO_SCRIPTS +
DLCTL_NO_JAVA + DLCTL_NO_DLACTIVEXCTLS +
DLCTL_NO_RUNACTIVEXCTLS +
DLCTL_SILENT;
PVariant(VarResult)^ := I;
Result := S_OK;
end
else
Result := DISP_E_MEMBERNOTFOUND;
end;
function TUILess.SaveObject: HRESULT;
begin
Result := E_NOTIMPL;
end;
function TUILess.GetMoniker(dwAssign: Longint; dwWhichMoniker: Longint;
out mk: IMoniker): HRESULT;
begin
Result := E_NOTIMPL;
end;
function TUILess.GetContainer(out container: IOleContainer): HRESULT;
begin
Result := E_NOTIMPL;
end;
function TUILess.ShowObject: HRESULT;
begin
Result := E_NOTIMPL;
end;
function TUILess.OnShowWindow(fShow: BOOL): HRESULT;
begin
Result := E_NOTIMPL;
end;
function TUILess.RequestNewObjectLayout: HRESULT;
begin
Result := E_NOTIMPL;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
cHTML: WideString = '<b>test</b><script>alert("boo")</script>';
var
Doc: IHTMLDocument2;
DocClientSite: TUILess;
begin
DocClientSite := TUILess.Create(nil);
try
Doc := coHTMLDocument.Create as IHTMLDocument2;
try
(Doc as IOleObject).SetClientSite(DocClientSite);
(Doc as IOleControl).OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL); // Invoke
OleVariant(Doc).write(cHTML);
Doc.close;
ShowMessage(Doc.body.innerHtml); // Test
finally
(Doc as IOleObject).SetClientSite(nil);
Doc := nil;
end;
finally
DocClientSite.Free;
end;
end;
我擔心你無法輕易隱藏這條消息。 為什么?
首先,您需要了解該消息甚至在該特定網站上顯示的原因。 簡短的回答是處理過歐盟有時在今年開始使用的cookie的新法律回合(不確定何時):
然后你需要意識到顯示的消息不是任何標准的彈出消息,而是硬編碼到網站中。 更糟糕的是,每個網站所有者都使用自己的方法來做到這一點。
BTW在您的網絡瀏覽器中禁用cookie不會阻止該消息顯示。 為什么? 如果網站想要查看是否有cookie,則必須向客戶端計算機發送cookie。 但是法律要求用戶在將任何cookie發送到客戶端計算機之前就會被警告使用cookie。
因此,單擊我接受使用cokies一次可能更容易,並且該消息可能不會顯示agina。 為什么? 因此,webite會創建一個永久性cookie,用於存儲您已同意使用cookie的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.