Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы захвата ошибок JavaScript в ActiveX WebBrowser Internet Explorer через IOleCommandTarget

Delphi , Технологии , ActiveX

Введение

В процессе разработки приложений, использующих компонент ActiveX WebBrowser от Internet Explorer, разработчики могут столкнуться с необходимостью захвата ошибок JavaScript. Одним из способов реализации такой функции является использование интерфейса IOleCommandTarget. В данной статье мы рассмотрим, как можно настроить захват ошибок JavaScript в MS IE ActiveX control, реализовав IOleCommandTarget в своем приложении и слушая событие OLECMDID_SHOWSCRIPTERROR.

Описание проблемы

Пользователь столкнулся с проблемой, при которой метод Exec интерфейса IOleCommandTarget вызывается только один раз с параметром nCmdID, равным OLECMDID_PAGEACTIONBLOCKED, но не вызывается с OLECMDID_SHOWSCRIPTERROR, который необходим для захвата ошибок JavaScript. Пример кода, вызывающего ошибку, представлен ниже:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>TEST SCRIPT</title>
</head>
<body>
    <script type="text/javascript">
        document.body.style.background='yellow';
        setTimeout(function(){
            document.body.style.background='red';
            causeERROR(); // целенаправленно неопределенная функция
            document.body.style.background='green';
        },500);
    </script>
</body>
</html>

После возникновения ошибки пользователь ожидает, что метод Exec будет вызван, но это не происходит.

Реализация IOleCommandTarget в Delphi

Приведенный ниже код является примером реализации интерфейса IOleCommandTarget в Delphi:

type
  TNulWBContainer = class(TWebBrowser, IUnknown, IOleClientSite,
                          IDocHostUIHandler, IDispatch, IOleCommandTarget)
  protected
    { ОТЪЕМ НЕ ВАЖНО }
    { IOleCommandTarget Interface }
    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;
implementation
    { ОТЪЕМ НЕ ВАЖНО }
    function TNulWBContainer.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
      prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall;
    begin
      prgCmds.cmdf := OLECMDF_ENABLED;
      Result := S_OK;
    end;
    function TNulWBContainer.Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
      const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall;
    begin
      ShowMessage('nCmdID=$'+IntToHex(nCmdID,8));
      Result:=OLECMDERR_E_UNKNOWNGROUP;
    end;
end.

Подтвержденный ответ

Пользователь сообщает, что проблема была решена. Ошибка заключалась в неправильной настройке параметров отладки в Internet Explorer. Необходимо, чтобы параметр "Disable Script Debugging (Internet Explorer)" был отключен, а "Disable Script Debugging (Other)" - включен. Это нестандартное поведение, которое не документировано и было обнаружено спустя длительное время после публикации соответствующего сообщения на форуме.

Решение проблемы через реестр

Для программного решения проблемы можно использовать следующий код на Delphi, который изменяет настройки отладки в реестре:

uses Registry;

    // ...
    with TRegistry.Create do
    try
      RootKey:=HKEY_CURRENT_USER;
      if OpenKey('\Software\Microsoft\Internet Explorer\Main',False) then begin
        WriteString('DisableScriptDebuggerIE','no');
        WriteString('Disable Script Debugger','yes');
        CloseKey;
      end;
    finally
      Free;
    end;
    // ...

Заключение

В данной статье мы рассмотрели проблему захвата ошибок JavaScript в ActiveX WebBrowser Internet Explorer и ее решение через интерфейс IOleCommandTarget. Приведены примеры кода на Delphi и обсуждены нестандартные настройки отладки в Internet Explorer, которые необходимо учитывать при разработке приложений, использующих WebBrowser.

Создано по материалам из источника по ссылке.

Проблема заключается в необходимости захвата ошибок JavaScript в ActiveX WebBrowser Internet Explorer через интерфейс IOleCommandTarget, который не вызывается должным образом, и решена она через корректную настройку параметров отладки в Internet Explorer


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ActiveX ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:57:28/0.0054330825805664/1