2016-09-21 2 views
0

Ich implementiere die Exec-Methode von TWebBrowser basierend auf this Antwort. Diese Methode wird immer dann ausgelöst, wenn ein Skriptfehler auftritt. Jetzt muss ich Fehlerinformationen erhalten.Wie bekomme ich TWebBrowser Fehlerinformationen

Ich erhalte zuerst das Ereignisobjekt des TWebBrowser. Ich versuche, die Informationen, die ich brauche zu bekommen

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; 

Und dann (wie in this Link gezeigt) GetIDsOfNames und Invoke Funktionen der Schnittstelle. Ein funktionierender Delphi-Code für die Verwendung dieser Methoden befindet sich in this Dokumentationslink.

So verwende ich diese Funktionen für das Event-Objekt.

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); 

Die GetIDsOfNames fuGetIDsOfNames Funktion richtig ausgeführt wird, gibt ein akzeptabler ganze Zahl DispatchId und gibt S_OK.

Aber die Invoke Funktion schlägt einfach fehl. Es gibt eine negative Ganzzahl als HRESULT zurück und gibt nichts an MethodResult aus.

Wie kann ich das umgehen?

Antwort

1

Die Fehlerwerte, auf die Sie zugreifen möchten, sind keine Objektmethoden, sie sind Eigenschaften. Daher wird Invoke() aufgrund Ihrer Verwendung von DISPATCH_METHOD fehlschlagen. Verwenden Sie stattdessen DISPATCH_PROPERTYGET.

jedoch OleVariant (und Variant) hat eine integrierte Unterstützung für IDispatch.Invoke(), so dass Sie brauchen nicht manuell überhaupt mit ihm verwirren. Sie können Objektmethoden normal aufrufen und Objekteigenschaften lesen und schreiben, und der Compiler erzeugt die notwendigen IDispatch Aufrufe für Sie.

etwas mehr wie die Sie interessieren:

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

Arbeiten wie ein Charme. –

Verwandte Themen