프로그래밍 초보 탈출

Libraries/Delphi Library

[WebBrowser] Internet Explorer Library

째즈토끼 2022. 6. 22. 23:15

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