2016-09-21 2 views
0

私はthis答えに基づいてTWebBrowserのExecメソッドを実装しています。このメソッドは、スクリプトエラーが発生するたびにトリガーされます。今私はエラー情報を取得する必要があります。TWebBrowserエラー情報を取得する方法

まず、TWebBrowserのイベントオブジェクトを取得します。

var 
Doc: IHTMLDocument2; 
HTMLWindow: IHTMLWindow2; 
Event: IHTMLEventObj; 
MethodName: String; 
MethodResult: OleVariant; 
DispatchId: Integer; 
Param: array of OleVariant; 

begin 

//Avoid non-error calls 
if nCmdID != OLECMDID_SHOWSCRIPTERROR then 
    Exit; 

//Get hold of the event object 
Doc := MapForm.WebBrowser.Document as IHTMLDocument2; 
if not Assigned(Doc) then 
    Exit; 


HTMLWindow := Doc.parentWindow; 
if not Assigned(HTMLWindow) then 
    Exit; 


//Get the current event 
Event := HTMLWindow.event; 

そして私は、私はインターフェイスのGetIDsOfNamesInvoke機能を使用して(thisリンクに示されているように)必要な情報を取得しようとしています。これらのメソッドを使用するための動作中のDelphiコードはthis documentation linkにあります。

ここでは、これらの関数をEventオブジェクトで使用する方法を示します。

MethodName := 'errorMessage'; 
Result := Event.GetIDsOfNames(GUID_NULL, @MethodName, 1,  SysLocale.DefaultLCID, @DispatchId); 

Result := Event.Invoke(DispatchId, GUID_NULL, SysLocale.DefaultLCID, DISPATCH_METHOD, Param, @MethodResult, nil, nil); 

GetIDsOfNames fuGetIDsOfNames機能が正しく実行、DispatchIdに許容される整数を出力しS_OKを返します。

しかし、Invoke関数は失敗します。いくつかの負の整数をHRESULTとして返し、何も出力しません。MethodResultになります。

どうすれば対処できますか?

答えて

1

アクセスしようとしているエラー値はオブジェクトメソッドではありません。したがって、プロパティはInvoke()で、DISPATCH_METHODのために失敗します。代わりにDISPATCH_PROPERTYGETを使用してください。

ただし、OleVariant(およびVariant)にはIDispatch.Invoke()の組み込みサポートが組み込まれているため、手動で処理する必要はありません。オブジェクトメソッドを呼び出すと、通常はオブジェクトのプロパティを読み書きでき、コンパイラは必要なIDispatch呼び出しを生成します。魔法のように

function TWebBrowser.Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD; 
    const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; stdcall; 
var 
    Event: OleVariant; 
    ErrorLine: Integer; 
    ErrorChar: Char; 
    ErrorCode: Integer; 
    ErrorMsg: String; 
    ErrorUrl: String; 
begin 
    if (CmdGroup = nil) or not IsEqualGUID(CmdGroup^, CGID_DocHostCommandHandler) then 
    begin 
    Result := OLECMDERR_E_UNKNOWNGROUP; 
    Exit; 
    end; 

    if nCmdID <> OLECMDID_SHOWSCRIPTERROR then 
    begin 
    Result := OLECMDERR_E_NOTSUPPORTED; 
    Exit; 
    end; 

    Event := (IUnknown(vaIn) as IHTMLDocument2).parentWindow.event; 

    ErrorLine := Event.errorLine; 
    ErrorChar := Event.errorCharacter; 
    ErrorCode := Event.errorCode; 
    ErrorMsg := Event.errorMessage; 
    ErrorUrl := Event.errorUrl; 

    ... 

    if (should continue running scripts) then 
    begin 
    vaOut := True; 
    end else 
    begin 
    vaOut := False; 
    end; 

    Result := S_OK; 
end; 
+0

作品:

は、より多くのこのような何かを試してみてください。 –

関連する問題