2016-09-21 11 views
0

Я реализую метод Exec TWebBrowser на основе ответа this. Этот метод запускается всякий раз, когда возникает ошибка сценария. Теперь мне нужно получить информацию об ошибках.Как получить информацию об ошибке 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; 

И тогда я пытаюсь получить информацию мне нужно (как показано в this ссылки) с помощью GetIDsOfNames и Invoke функции интерфейса. Рабочий код 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.

Однако OleVariantVariant) имеет встроенную поддержку для 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

работает как шарм. –

 Смежные вопросы

  • Нет связанных вопросов^_^