183 lines
6.1 KiB
Plaintext
183 lines
6.1 KiB
Plaintext
{*******************************************************}
|
|
{ }
|
|
{ Tocsg.WebBrowser }
|
|
{ }
|
|
{ Copyright (C) 2022 kku }
|
|
{ }
|
|
{*******************************************************}
|
|
|
|
unit Tocsg.WebBrowser;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, ComObj, ActiveX, SHDocVw;
|
|
|
|
procedure ClearInternetExplorerHistory;
|
|
|
|
const
|
|
CLSID_CUrlHistory: TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}';
|
|
|
|
type
|
|
// 자바 스크립트 오류 뜨는 문제 해결 19_0918 23:06:50 kku
|
|
TWebBrowser = class(SHDocVw.TWebBrowser, IOleCommandTarget)
|
|
private
|
|
function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal; prgCmds: POleCmd;
|
|
CmdText: POleCmdText): HRESULT; stdcall;
|
|
function Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
|
|
const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; stdcall;
|
|
end;
|
|
|
|
TSTATURL = record
|
|
cbSize: DWORD;
|
|
pwcsUrl: DWORD;
|
|
pwcsTitle: DWORD;
|
|
ftLastVisited: FILETIME;
|
|
ftLastUpdated: FILETIME;
|
|
ftExpires: FILETIME;
|
|
dwFlags: DWORD;
|
|
end;
|
|
|
|
IEnumSTATURL = interface(IUnknown)
|
|
['{3C374A42-BAE4-11CF-BF7D-00AA006946EE}']
|
|
function Next(celt: Integer; out elt; pceltFetched: PLongint): HRESULT; stdcall;
|
|
function Skip(celt: Longint): HRESULT; stdcall;
|
|
function Reset: HResult; stdcall;
|
|
function Clone(out ppenum: IEnumSTATURL): HResult; stdcall;
|
|
function SetFilter(poszFilter: PWideChar; dwFlags: DWORD): HResult; stdcall;
|
|
end;
|
|
|
|
IUrlHistoryStg = interface(IUnknown)
|
|
['{3C374A41-BAE4-11CF-BF7D-00AA006946EE}']
|
|
function AddUrl(pocsUrl: PWideChar; pocsTitle: PWideChar; dwFlags: Integer): HResult; stdcall;
|
|
function DeleteUrl(pocsUrl: PWideChar; dwFlags: Integer): HResult; stdcall;
|
|
function QueryUrl(pocsUrl: PWideChar; dwFlags: Integer; var lpSTATURL: TSTATURL): HResult; stdcall;
|
|
function BindToObject(pocsUrl: PWideChar; var riid: TIID; out ppvOut: Pointer): HResult; stdcall;
|
|
function EnumUrls(out ppenum: IEnumSTATURL): HResult; stdcall;
|
|
end;
|
|
|
|
IUrlHistoryStg2 = interface(IUrlHistoryStg)
|
|
['{AFA0DC11-C313-11D0-831A-00C04FD5AE38}']
|
|
function AddUrlAndNotify(pocsUrl: PWideChar; pocsTitle: PWideChar; dwFlags: Integer;
|
|
fWriteHistory: Integer; var poctNotify: Pointer;
|
|
const punkISFolder: IUnknown): HResult; stdcall;
|
|
function ClearHistory: HResult; stdcall;
|
|
end;
|
|
|
|
function GetHtmlFromWebBrowser(webBrowser: SHDocVw.TWebBrowser): String;
|
|
function GetEntraIdFromBrowserHis(sHisPath, sUrlHead, sChDomain, sDomain: String): String;
|
|
|
|
implementation
|
|
|
|
uses
|
|
MSHTML, EM.SQLiteTable3, Tocsg.Safe, System.SysUtils, Tocsg.Exception;
|
|
|
|
function GetHtmlFromWebBrowser(webBrowser: SHDocVw.TWebBrowser): String;
|
|
var
|
|
doc2: IHTMLDocument2;
|
|
begin
|
|
doc2 := webBrowser.Document as IHTMLDocument2;
|
|
result := doc2.body.innerHTML;
|
|
end;
|
|
|
|
procedure ClearInternetExplorerHistory;
|
|
var
|
|
stg: IUrlHistoryStg2;
|
|
begin
|
|
stg := CreateComObject(CLSID_CUrlHistory) as IUrlHistoryStg2;
|
|
stg.ClearHistory;
|
|
end;
|
|
|
|
{ TWebBrowser }
|
|
|
|
function TWebBrowser.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
|
|
prgCmds: POleCmd; CmdText: POleCmdText): HRESULT; stdcall;
|
|
begin
|
|
Result := S_OK;
|
|
end;
|
|
|
|
function TWebBrowser.Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
|
|
const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; stdcall;
|
|
begin
|
|
// presume that all commands can be executed; for list of available commands
|
|
// see SHDocVw.pas unit, using this event you can suppress or create custom
|
|
// events for more than just script error dialogs, there are commands like
|
|
// undo, redo, refresh, open, save, print etc. etc.
|
|
// be careful, because not all command results are meaningful, like the one
|
|
// with script error message boxes, I would expect that if you return S_OK,
|
|
// the error dialog will be displayed, but it's vice-versa
|
|
Result := S_OK;
|
|
|
|
// there's a script error in the currently executed script, so
|
|
if nCmdID = OLECMDID_SHOWSCRIPTERROR then
|
|
begin
|
|
// if you return S_FALSE, the script error dialog is shown
|
|
Result := S_FALSE;
|
|
// if you return S_OK, the script error dialog is suppressed
|
|
Result := S_OK;
|
|
end;
|
|
end;
|
|
|
|
// 브라우저에서 MS Entra에 로그인 사용 시 히스토리에서 계정 정보를 가져온다 25_0902 09:49:58 kku
|
|
// 크롬, 엣지 지원
|
|
// sUrlHead = enpulse365-my.sharepoint.com
|
|
// sChDomain = _partner_enpulse_co_kr
|
|
// sDomain = @partner.enpulse.co.kr
|
|
function GetEntraIdFromBrowserHis(sHisPath, sUrlHead, sChDomain, sDomain: String): String;
|
|
var
|
|
db: TSQLiteDatabase;
|
|
tbl: TSQLiteTable;
|
|
i, n: Integer;
|
|
sTable, SQL, sUrl: String;
|
|
begin
|
|
Result := '';
|
|
|
|
try
|
|
Guard(db, TSQLiteDatabase.Create(sHisPath));
|
|
|
|
sTable := 'urls'; // Opera, Chrome, Edge
|
|
// sTable := 'moz_places'; // Firefox
|
|
SQL := 'select url from urls';
|
|
// SQL := 'select url, title, VISIT_COUNT, LAST_VISIT_time from urls';
|
|
// SQL := 'select url, title, VISIT_COUNT, LAST_VISIT_DATE from moz_places'; // Firefox
|
|
|
|
if db.TableExists(sTable) then
|
|
begin
|
|
Guard(tbl, db.GetTable(SQL));
|
|
|
|
if tbl.MoveLast then
|
|
begin
|
|
for i := tbl.Count - 1 downto 0 do
|
|
begin
|
|
sUrl := tbl.Fields[0];
|
|
// sUrl := 'https://enpulse365-my.sharepoint.com/:p:/r/personal/shlee_partner_enpulse_co_kr/_layouts/15/doc2.aspx';
|
|
if Pos('enpulse365-my.sharepoint.com', sUrl) > 0 then
|
|
begin
|
|
n := Pos('personal/', sUrl);
|
|
if n > 0 then
|
|
begin
|
|
Delete(sUrl, 1, n + 8);
|
|
n := Pos('/', sUrl);
|
|
if n > 0 then
|
|
begin
|
|
Delete(sUrl, n, Length(sUrl) - n + 1);
|
|
// ID에 _ 가 있을 수 있어서 아래처럼 치환
|
|
Result := StringReplace(sUrl, '_partner_enpulse_co_kr', '@partner.enpulse.co.kr', [rfReplaceAll]);
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if not tbl.Previous then
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
except
|
|
on E: Exception do
|
|
ETgException.TraceException(E, 'Fail .. GetEntraIdFromBrowserHis()');
|
|
end;
|
|
end;
|
|
|
|
end.
|