IE는 무덤으로 갔지만... 컨트롤은 남아 있겠지.
unit LibIExplore;
interface
uses
Windows, Messages, SysUtils, Classes, Dialogs,
SHDocVW, MSHTML, ActiveX, ComObj, Variants, ShlObj,
LibWindowsDynamicLoader, LibString, LibProcessToken;
type
TSearchFrameProc = Procedure(APP : IWebBrowserApp; Depth : Integer); stdcall;
TSearchIEProc = Procedure(WB : IWebBrowser2; Param : DWORD; var StopSearch : Boolean); stdcall;
TSearchIEProcEx = Procedure(WB : IWebBrowser2; Param : DWORD; var StopSearch : Boolean) of Object;
// The IWebBrowser and IWebBrowserApp interfaces are deprecated.
function GetFrameApp(F: IHTMLWindow2): IWebBrowserApp; // 이걸 쓰지말고 IE_ExtractBrowserApp 를 써라.
function GetFrameDocument(F: IHTMLWindow2): IHTMLDocument2; // 이걸 쓰지말고 IE_ExtractDocument 를 써라.
function SearchAllFrame(F: IHTMLWindow2; FProc : TSearchFrameProc) : Integer; overload;
function SearchAllFrame(F: IHTMLDocument2; FProc : TSearchFrameProc) : Integer; overload;
function SearchAllFrame(F: IWebBrowser2; FProc : TSearchFrameProc) : Integer; overload;
function SearchIE(FProc : TSearchIEProc; const Param : DWORD = 0) : Integer; overload;
function SearchIE(FProc : TSearchIEProcEx; const Param : DWORD = 0) : Integer; overload;
function SearchIEAndAllFrame(FProc : TSearchFrameProc) : Integer;
function GetHTMLSourceStream(D : IHTMLDocument2) : TStringStream;
procedure SetHTMLSourceStream(D : IHTMLDocument2; M : TStream);
function GetHTMLSourceString(D : IHTMLDocument2) : String;
procedure SetHTMLSourceString(D : IHTMLDocument2; S : String);
procedure SetHTMLSourceResource(WB : TWebBrowser; const RES : String);
function GetInterface_IWebBrowser2(Window : IHTMLWindow2) : IWebBrowser2; // 이걸 쓰지말고 IE_ExtractBrowser 를 써라.
procedure AppendHTML(WB : TWebBrowser; HTML: PChar);
procedure ClearHTMLBody(WB : TWebBrowser);
procedure SetHTMLBody(WB : TWebBrowser; const HTML : String);
procedure SetHTMLBodyColor(WB : TWebBrowser; const fg,bg : String);
procedure AlertHTML(WB : TWebBrowser; const Text : String);
// 2011.05.13 JAZZ
// 0 : Unsupport/Error, 1: Low, 2: Medium, 3: High
function ProtectedMode_GetIntegrityLevel : Integer;
// 2011.05.17 JAZZ
function IEIsProtectedModeProcess(var isON: BOOL): HRESULT; stdcall; overload;
function IEIsProtectedModeProcess: BOOL; overload;
// 2011.05.20 JAZZ
function IE_GetVersion(const W: IHTMLWindow2; var Major, Minor : DWORD) : Boolean;
// 2011.05.24 JAZZ
function IE_GetTabWindowHWND(WB : IWebBrowser2): HWND;
// 2011.05.25 JAZZ
function IE_ExtractDocument(const Src: IWebBrowserApp) : IHTMLDocument2; overload;
function IE_ExtractDocument(const Src: IWebBrowser2) : IHTMLDocument2; overload;
function IE_ExtractDocument(const Src: IHTMLWindow2) : IHTMLDocument2; overload;
function IE_ExtractDocument(const Src: HWND) : IHTMLDocument2; overload;
function IE_ExtractBrowser(const Src: IHTMLWindow2) : IWebBrowser2; overload;
function IE_ExtractBrowser(const Src: IHTMLDocument2): IWebBrowser2; overload;
function IE_ExtractBrowser(const Src: HWND): IWebBrowser2; overload;
function IE_ExtractWindow(const Src: IWebBrowser2) : IHTMLWindow2; overload;
function IE_ExtractWindow(const Src: IHTMLDocument2) : IHTMLWindow2; overload;
function IE_ExtractBrowserApp(Src: IHTMLWindow2): IWebBrowserApp; overload;
function IE_ExtractBrowserApp(Src: IWebBrowser2): IWebBrowserApp; overload;
// 2011.05.25 JAZZ
function SearchIE2(FProc: TSearchIEProcEx; const Param : DWORD = 0) : Integer;
function GetFrameApp(F: IHTMLWindow2): IWebBrowserApp;
begin
RESULT := IE_ExtractBrowserApp(F);
end;
function GetFrameDocument(F: IHTMLWindow2): IHTMLDocument2;
begin
RESULT := IE_ExtractDocument(F);
end;
function SearchAllFrame(F: IHTMLWindow2; FProc : TSearchFrameProc) : Integer;
var
FAccessDenyFrames : Integer;
FTotalCount : Integer;
procedure _DoLoop(F: IHTMLWindow2; Depth : Integer);
var
I : Integer;
D : IWebBrowserApp;
V : OleVariant;
Q : IHTMLWindow2;
begin
Inc(FTotalCount);
D := GetFrameApp(F);
if D=nil then begin
Inc(FAccessDenyFrames);
Exit;
end;
if Assigned(FProc) then FProc(D, Depth);
if F.frames.length>0 then
for I:=0 to F.frames.length-1 do begin
V := I;
V := F.frames.item(V);
Q := IUnknown(V) as IHTMLWindow2;
_DoLoop(Q, Depth + 1);
end;
end;
begin
FAccessDenyFrames := 0;
FTotalCount := 0;
_DoLoop(F, 0);
RESULT := (FAccessDenyFrames shl 16) or FTotalCount;
end;
function SearchAllFrame(F: IHTMLDocument2; FProc : TSearchFrameProc) : Integer; overload;
var
W : IHTMLWindow2;
begin
RESULT := 0;
if F.parentWindow=nil then Exit;
if F.parentWindow.QueryInterface(IHTMLWindow2, W)<>S_OK then Exit;
RESULT := SearchAllFrame(W, FProc);
end;
function SearchAllFrame(F: IWebBrowser2; FProc : TSearchFrameProc) : Integer; overload;
var
D : IHTMLDocument2;
begin
RESULT := 0;
if F.Document=nil then Exit;
if F.Document.QueryInterface(IHTMLDocument2, D)<>S_OK then Exit;
RESULT := SearchAllFrame(D, FProc);
end;
function SearchIE(FProc : TSearchIEProc; const Param : DWORD = 0) : Integer;
var
FS : IShellWindows;
Count, I : Integer;
StopSearch : Boolean;
Webb : IWebBrowser2;
WebV : Variant;
Buf : String;
D : IUnknown;
begin
FS := CoShellWindows.Create;
Count := FS.Count;
RESULT := 0;
if Count>0 then begin
StopSearch := False;
for I:=0 to Count-1 do begin
D := FS.Item(I);
if (D=nil) or (D.QueryInterface(IID_IWebBrowser2, Webb)<>S_OK) then Webb := nil;
if Assigned(Webb) then begin
Buf := '<_>';
try WebV := Webb;
Buf := WebV.Document.URL;
except;
end;
if Buf<>'<_>' then begin
Inc(RESULT);
if Assigned(FProc) then FProc(Webb, Param, StopSearch);
if StopSearch then Break;
end;
end;
end;
end;
FS := nil;
end;
function SearchIE(FProc : TSearchIEProcEx; const Param : DWORD = 0) : Integer;
var
FS : IShellWindows;
Count, I : Integer;
StopSearch : Boolean;
Webb : IWebBrowser2;
WebV : Variant;
Buf : String;
D : IUnknown;
begin
FS := CoShellWindows.Create;
Count := FS.Count;
RESULT := 0;
if Count>0 then begin
StopSearch := False;
for I:=0 to Count-1 do begin
D := FS.Item(I);
if (D=nil) or (D.QueryInterface(IID_IWebBrowser2, Webb)<>S_OK) then Webb := nil;
if Assigned(Webb) then begin
Buf := '<_>';
try WebV := Webb;
Buf := WebV.Document.URL;
except;
end;
if Buf<>'<_>' then begin
Inc(RESULT);
if Assigned(FProc) then FProc(Webb, Param, StopSearch);
if StopSearch then Break;
end;
end;
end;
end;
FS := nil;
end;
function SearchIE2(FProc: TSearchIEProcEx; const Param : DWORD = 0) : Integer;
var
I, Count : Integer;
Frame, Wrap, Tab : HWND;
Ver : Integer;
Tabs : array of HWND;
StopSearch : Boolean;
WB : IWebBrowser2;
begin
Ver := 6;
Frame := 0;
Count := 0;
while TRUE do begin
Frame := FindWindowEx(0, Frame, 'IEFrame', nil);
if Frame = 0 then Break;
//-------------------------------------------------------------------------
// IE8, IE9 : IEFrame > Frame Tab > TabWindowClass
//-------------------------------------------------------------------------
Wrap := 0;
while TRUE do begin
Wrap := FindWindowEx(Frame, Wrap, 'Frame Tab', nil);
if Wrap = 0 then Break;
Ver := 8;
Tab := 0;
while TRUE do begin
Tab := FindWindowEx(Wrap, Tab, 'TabWindowClass', nil);
if Tab = 0 then Break;
SetLength(Tabs, Count+1);
Tabs[Count] := Tab;
Inc(Count);
end;
end;
//-------------------------------------------------------------------------
// IE7 : IEFrame > TabWindowClass
//-------------------------------------------------------------------------
Tab := 0;
while TRUE do begin
Tab := FindWindowEx(Frame, Tab, 'TabWindowClass', nil);
if Tab = 0 then Break;
Ver := 7; // IE7
SetLength(Tabs, Count+1);
Tabs[Count] := Tab;
Inc(Count);
end;
//-------------------------------------------------------------------------
// IE6 : IEFrame
//-------------------------------------------------------------------------
if Ver < 7 then begin
SetLength(Tabs, Count+1);
Tabs[Count] := Frame;
Inc(Count);
end;
end;
RESULT := 0;
StopSearch := FALSE;
CoInitialize(nil);
if (Count > 0) and Assigned(FProc) then for I:=0 to Count-1 do begin
WB := IE_ExtractBrowser(Tabs[I]);
if not Assigned(WB) then Continue;
Inc(RESULT);
FProc(WB, Param, StopSearch);
WB := nil;
if StopSearch then Break;
end;
CoUninitialize();
SetLength(Tabs, 0);
end;
procedure CloseIE7Window(Parent: HWND);
var
I, Count : Integer;
Last : HWND;
Tabs : array of HWND;
begin
Count := 0;
Last := 0;
while TRUE do begin
Last := FindWindowEx(Parent, Last, 'TabWindowClass', nil);
if Last = 0 then Break;
SetLength(Tabs, Count+1);
Tabs[Count] := Last;
Inc(Count);
end;
if Count > 0 then for I:=0 to Count-1 do begin
PostMessage(Tabs[I], WM_CLOSE, 0, 0);
end;
SetLength(Tabs, 0);
// PostMessage(Parent, WM_CLOSE, 0, 0);
end;
procedure CloseIE8Window(Parent: HWND);
var
I, Count : Integer;
Last, Child : HWND;
Tabs : array of HWND;
begin
Count := 0;
Last := 0;
while TRUE do begin
Last := FindWindowEx(Parent, Last, 'Frame Tab', nil);
if Last = 0 then Break;
Child := FindWindowEx(Last, 0, 'TabWindowClass', nil);
if Child = 0 then Continue;
SetLength(Tabs, Count+1);
Tabs[Count] := Child;
Inc(Count);
end;
if Count > 0 then for I:=0 to Count-1 do begin
PostMessage(Tabs[I], WM_CLOSE, 0, 0);
end;
SetLength(Tabs, 0);
// PostMessage(Parent, WM_CLOSE, 0, 0);
end;
var
__SProc : TSearchFrameProc;
__RT : Integer;
Procedure __FProc(WB : IWebBrowser2; Param : DWORD; var StopSearch : Boolean); stdcall;
begin
__RT := __RT + SearchAllFrame(WB, __SProc);
end;
function SearchIEAndAllFrame(FProc : TSearchFrameProc) : Integer;
begin
__SProc := FProc;
__RT := 0;
SearchIE(__FProc);
RESULT := __RT;
end;
function GetHTMLSourceStream(D : IHTMLDocument2) : TStringStream;
var
AP : TStreamAdapter;
begin
RESULT := TStringStream.Create('');
AP := TStreamAdapter.Create(RESULT);
(D as IPersistStreamInit).Save(AP, True);
// AP.Free;
end;
procedure SetHTMLSourceStream(D : IHTMLDocument2; M : TStream);
var
AP : TStreamAdapter;
begin
M.Seek(0, soFromBeginning);
AP := TStreamAdapter.Create(M);
(D as IPersistStreamInit).Load(AP);
// AP.Free;
end;
function GetHTMLSourceString(D : IHTMLDocument2) : String;
var
M : TStringStream;
begin
M := GetHTMLSourceStream(D);
M.Seek(0, soFromBeginning);
RESULT := M.DataString;
M.Free;
end;
procedure SetHTMLSourceString(D : IHTMLDocument2; S : String);
var
M : TStringStream;
begin
M := TStringStream.Create(S);
SetHTMLSourceStream(D, M);
M.Free;
end;
function GetInterface_IWebBrowser2(Window : IHTMLWindow2) : IWebBrowser2;
begin
RESULT := IE_ExtractBrowser(Window);
end;
procedure SetHTMLSourceResource(WB : TWebBrowser; const RES: String);
var
FN : Array[0..MAX_PATH] of Char;
URL, Flag : OleVariant;
begin
GetModuleFileName(hInstance, FN, SizeOf(FN));
URL := 'res://'+FN+'/'+RES;
Flag := navNoWriteToCache;
try WB.Navigate2(URL, Flag);
except
end;
end;
procedure AppendHTML(WB : TWebBrowser; HTML : PChar);
var
_HTML : OleVariant;
begin
try _HTML := String(HTML);
WB.OleObject.Document.Body.InsertAdjacentHTML('beforeEnd', _HTML);
WB.OleObject.Document.Body.doScroll('Bottom');
except
end;
_HTML := Unassigned;
end;
procedure ClearHTMLBody(WB : TWebBrowser);
begin
try WB.OleObject.Document.Body.InnerHTML := '';
except
end;
end;
procedure SetHTMLBody(WB : TWebBrowser; const HTML : String);
begin
try WB.OleObject.Document.Body.InnerHTML := HTML;
except
end;
end;
procedure SetHTMLBodyColor(WB : TWebBrowser; const fg,bg : String);
begin
if fg<>'' then try WB.OleObject.Document.Body.Text := fg;
except
end;
if bg<>'' then try WB.OleObject.Document.Body.BgColor := bg;
except
end;
end;
procedure AlertHTML(WB : TWebBrowser; const Text : String);
var
Window : OleVariant;
begin
try Window := WB.OleObject.Document.parentWindow;
except
MessageBox(0, PChar(Text), 'Error', MB_OK);
Exit;
end;
if VarIsNULL(Window) then begin
MessageBox(0, PChar(Text), 'Error', MB_OK);
Exit;
end;
try Window.Alert(Text);
except
MessageBox(0, PChar(Text), 'Error', MB_OK);
Exit;
end;
end;
function ProtectedMode_GetIntegrityLevel : Integer;
var
dwIntegrityLevel : DWORD;
begin
dwIntegrityLevel := GetProcessIntegrityLevel(GetCurrentProcess());
if dwIntegrityLevel > 0 then begin
if dwIntegrityLevel < SECURITY_MANDATORY_MEDIUM_RID then begin
// 무결성 수준 낮음
RESULT := 1;
end
else if dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID then begin
// 무결성 수준 보통
RESULT := 2;
end
else begin
// 무결성 수준 높음
RESULT := 3;
end;
end
else begin
RESULT := 0;
end;
end;
var
DLL_IEFRAME : HMODULE; // IE6 이하에서는 이게 없다.
type
// HRESULT IEIsProtectedModeProcess(BOOL* pbResult);
TFunc_IEIsProtectedModeProcess = function (var isON: BOOL): HRESULT; stdcall; // VISTA, IE7
var
Func_IEIsProtectedModeProcess : TFunc_IEIsProtectedModeProcess;
function IEIsProtectedModeProcess(var isON: BOOL): HRESULT; stdcall;
begin
if @Func_IEIsProtectedModeProcess = nil then begin
@Func_IEIsProtectedModeProcess := __LoadDynamicFunction('IEFrame.DLL', 'IEIsProtectedModeProcess', @DLL_IEFRAME, FALSE);
if @Func_IEIsProtectedModeProcess = nil then @Func_IEIsProtectedModeProcess := Pointer(-1);
end;
if @Func_IEIsProtectedModeProcess <> Pointer(-1) then begin
RESULT := Func_IEIsProtectedModeProcess(isON);
end
else begin
// 이 함수가 지원되지 않는다면 Protected Mode일 수가 없다. XP/2000/IE6이하
RESULT := S_OK;
isON := FALSE;
end;
end;
function IEIsProtectedModeProcess: BOOL;
begin
if FAILED(IEIsProtectedModeProcess(RESULT)) then begin
RESULT := FALSE;
end;
end;
function IE_GetVersion(const W: IHTMLWindow2; var Major, Minor : DWORD) : Boolean;
var
Buffer : AnsiString;
N : Integer;
begin
RESULT := FALSE;
try
Buffer := AnsiString(W.navigator.userAgent);
except
Exit;
end;
N := Pos('MSIE ', Buffer);
if N = 0 then Exit;
Delete(Buffer, 1, N + 4);
Buffer := Parsing(Buffer, ';');
Major := StrToIntDef(Parsing(Buffer, '.'), 0);
Minor := StrToIntDef(Parsing(Buffer, '.'), 0);
RESULT := (Major > 0);
end;
function IE_GetTabWindowHWND(WB : IWebBrowser2): HWND;
const
SID_SShellBrowser: TGUID = '{000214E2-0000-0000-C000-000000000046}';
var
S : IServiceProvider;
OleWindow : IOleWindow;
W : HWND;
begin
if Assigned(WB) and
SUCCEEDED(WB.QueryInterface(IServiceProvider, S)) and
Assigned(S) and
SUCCEEDED(S.QueryService(SID_SShellBrowser, IOleWindow, OleWindow)) and
Assigned(OleWindow) and
SUCCEEDED(OleWindow.GetWindow(W)) then begin
RESULT := W;
end
else begin
RESULT := 0;
end;
end;
function IE_ExtractDocument(const Src: IWebBrowserApp): IHTMLDocument2;
var
D : IDispatch;
begin
RESULT := nil;
if Assigned(Src) then begin
try D := Src.Document; // 여기서 "지정되지 않은 오류입니다."가 발생하는 경우가 있다.
except
D := nil
end;
if Assigned(D) and
SUCCEEDED(D.QueryInterface(IHTMLDocument2, RESULT)) then begin
// Nothing
end;
end;
end;
function IE_ExtractDocument(const Src: IWebBrowser2): IHTMLDocument2;
begin
RESULT := IE_ExtractDocument(IE_ExtractBrowserApp(Src));
end;
function IE_ExtractDocument(const Src: IHTMLWindow2): IHTMLDocument2;
begin
RESULT := IE_ExtractDocument(IE_ExtractBrowserApp(Src));
end;
var
DLL_OLEACC : HMODULE;
WM_HTML_GETOBJECT : DWORD;
type
TFunc_ObjectFromLResult = function(LRESULT: LRESULT; const IID: TIID; WPARAM: WPARAM; out pObject): HRESULT; stdcall;
var
Func_ObjectFromLResult : TFunc_ObjectFromLResult;
// XP 이상
function ObjectFromLResult(LRESULT: LRESULT; const IID: TIID; WPARAM: WPARAM; out pObject): HRESULT; stdcall;
begin
if @Func_ObjectFromLResult = nil then begin
@Func_ObjectFromLResult := __LoadDynamicFunction('OLEACC.DLL', 'ObjectFromLresult', @DLL_OLEACC, FALSE);
if @Func_ObjectFromLResult = nil then @Func_ObjectFromLResult := Pointer(-1);
end;
if @Func_ObjectFromLResult <> Pointer(-1) then begin
RESULT := Func_ObjectFromLResult(LRESULT, IID, WPARAM, pObject);
end
else begin
RESULT := E_NOTIMPL;
end;
end;
function __EnumChildProc(WND: HWND; Handle: PDWORD): BOOL; stdcall;
var
Buffer:array[0..MAX_PATH] of Char;
begin
if LongBool(GetClassName(WND, Buffer, MAX_PATH)) and
(String(Buffer) = 'Internet Explorer_Server') then begin
Handle^ := WND;
RESULT := FALSE; // Found. Stop.
end
else begin
RESULT := TRUE;
end;
end;
function IE_ExtractDocument(const Src: HWND) : IHTMLDocument2; overload;
var
ServerHandle : HWND;
LRES : DWORD;
Doc : IHTMLDocument;
begin
RESULT := nil;
if Src <> 0 then begin
ServerHandle := 0;
EnumChildWindows(Src, @__EnumChildProc, DWORD(@ServerHandle)); // Recursive Function.
if ServerHandle <> 0 then begin
LRES := 0;
SendMessageTimeout(ServerHandle, WM_HTML_GETOBJECT, 0, 0, SMTO_ABORTIFHUNG, 1000, LRES);
if (LRES <> 0) and
SUCCEEDED(ObjectFromLResult(LRES, IID_IHTMLDocument, 0, Doc)) and
SUCCEEDED(Doc.QueryInterface(IHTMLDocument2, RESULT)) then begin
// Nothing
end;
end;
end;
end;
function IE_ExtractBrowser(const Src: IHTMLWindow2) : IWebBrowser2;
var
ServiceProvider : IServiceProvider;
begin
if Assigned(Src) and
SUCCEEDED(Src.QueryInterface(IServiceProvider, ServiceProvider)) and
Assigned(ServiceProvider) and
SUCCEEDED(ServiceProvider.QueryService(IWebBrowserApp, IWebBrowser2, RESULT)) then begin
// Nothing
end
else begin
RESULT := nil;
end;
end;
function IE_ExtractBrowserApp(Src: IHTMLWindow2): IWebBrowserApp;
var
S : IServiceProvider;
begin
if Assigned(Src) and
SUCCEEDED(Src.QueryInterface(IServiceProvider, S)) and
Assigned(S) and
SUCCEEDED(S.QueryService(IWebBrowserApp, IID_IWebBrowserApp, RESULT)) then begin
// Nothing
end
else begin
RESULT := nil;
end;
end;
function IE_ExtractBrowserApp(Src: IWebBrowser2): IWebBrowserApp;
var
S : IServiceProvider;
begin
if Assigned(Src) and
SUCCEEDED(Src.QueryInterface(IServiceProvider, S)) and
Assigned(S) and
SUCCEEDED(S.QueryService(IWebBrowserApp, IID_IWebBrowserApp, RESULT)) then begin
// Nothing
end
else begin
RESULT := nil;
end;
end;
function IE_ExtractBrowser(const Src: IHTMLDocument2): IWebBrowser2;
begin
if Assigned(Src)
then RESULT := IE_ExtractBrowser(Src.parentWindow)
else RESULT := nil;
end;
function IE_ExtractBrowser(const Src: HWND): IWebBrowser2; overload;
begin
RESULT := IE_ExtractBrowser(IE_ExtractDocument(Src));
end;
function IE_ExtractWindow(const Src: IHTMLDocument2) : IHTMLWindow2;
begin
if Assigned(Src)
then RESULT := Src.parentWindow
else RESULT := nil;
end;
function IE_ExtractWindow(const Src: IWebBrowser2) : IHTMLWindow2;
begin
RESULT := IE_ExtractWindow(IE_ExtractDocument(Src));
end;
initialization
WM_HTML_GETOBJECT := RegisterWindowMessage('WM_HTML_GETOBJECT');
finalization
end.
'Libraries > Delphi Library' 카테고리의 다른 글
[System] Item ID List Library (0) | 2022.06.22 |
---|---|
[WebBrowser] Cookie Library (0) | 2022.06.22 |
[System] Window Desktop Library (0) | 2022.06.22 |
[DateTime] Lunar Library (0) | 2022.06.22 |
[IPC] Critical Section Class (0) | 2022.06.22 |