2016-09-21 52 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文檔鏈接中。

下面是我如何在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

就像一個魅力。 –