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

Проблема с инициализацией WebView2 в приложении на Delphi и ошибка HRESULT -2147023496

Delphi , Синтаксис , Ошибки и Исключения

 

Введение

Многие разработчики Delphi сталкиваются с проблемами при использовании компонента TEdgeBrowser для встраивания веб-контента в свои приложения. Одна из распространенных ошибок - HRESULT -2147023496 (или 0x80070578 в шестнадцатеричном формате), которая означает "недопустимый дескриптор окна". В этой статье мы разберем причины этой ошибки и предложим несколько способов ее решения.

Понимание проблемы

Ошибка HRESULT -2147023496 возникает при попытке создания WebView2 с недействительным дескриптором окна. Это может происходить по нескольким причинам:

  1. Проблемы с инициализацией WebView2
  2. Конфликты с другими компонентами формы
  3. Временные проблемы с окружением выполнения
  4. Ошибки в цепочке создания компонента

Как показано в обсуждении, ошибка может возникать непостоянно - иногда компонент работает корректно, а иногда выдает ошибку.

Базовое решение с TEdgeBrowser

Стандартный подход с использованием TEdgeBrowser выглядит так:

procedure TForm1.FormCreate(Sender: TObject);
begin
  EdgeBrowser1.CreateWebView;
end;

procedure TForm1.EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; 
  AResult: HRESULT);
begin
  if Succeeded(AResult) then
  begin
    if EdgeBrowser1.ControllerInterface <> nil then
      EdgeBrowser1.ControllerInterface.Set_IsVisible(True);
  end
  else
  begin
    ShowMessage('Ошибка создания WebView: ' + IntToStr(AResult));
    // Здесь можно попытаться перезапустить инициализацию
  end;
end;

Альтернативное решение #1: Перезапуск инициализации

Если ошибка возникает периодически, можно реализовать механизм повторной инициализации:

procedure TForm1.RetryWebViewCreation;
var
  RetryCount: Integer;
begin
  RetryCount := 0;
  while RetryCount < 3 do
  begin
    try
      EdgeBrowser1.CreateWebView;
      Break;
    except
      on E: Exception do
      begin
        Inc(RetryCount);
        if RetryCount >= 3 then
          raise;
        Sleep(1000 * RetryCount); // Увеличиваем задержку между попытками
      end;
    end;
  end;
end;

Альтернативное решение #2: Использование WebView4Delphi

Как предложил salvadordf, можно использовать альтернативную библиотеку WebView4Delphi, которая предоставляет более детальную информацию об ошибках:

uses
  WV2Loader, WV2Browser;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Настройка загрузчика
  GlobalWebView2Loader.OnInitializationError := WebView2InitializationError;

  // Создание браузера
  WVBrowser1 := TWVBrowser.Create(Self);
  WVBrowser1.OnInitializationError := WVBrowserInitializationError;
  WVBrowser1.DefaultUrl := 'about:blank';
  WVBrowser1.Parent := Self;
  WVBrowser1.Align := alClient;
  WVBrowser1.CreateBrowser;
end;

procedure TForm1.WebView2InitializationError(Sender: TObject; ErrorCode: HRESULT; 
  const ErrorMessage: wvstring);
begin
  ShowMessage('Ошибка инициализации WebView2: ' + ErrorMessage + 
              ' (код: ' + IntToHex(ErrorCode, 8) + ')');
end;

procedure TForm1.WVBrowserInitializationError(Sender: TObject; ErrorCode: HRESULT; 
  const ErrorMessage: wvstring);
begin
  ShowMessage('Ошибка создания браузера: ' + ErrorMessage + 
              ' (код: ' + IntToHex(ErrorCode, 8) + ')');
end;

Рекомендации по стабильной работе WebView2

  1. Проверка окружения: Убедитесь, что WebView2 Runtime установлен и актуален. Можно добавить проверку:
function IsWebView2RuntimeInstalled: Boolean;
begin
  Result := FileExists(GetEnvironmentVariable('ProgramFiles(x86)') + 
           '\Microsoft\EdgeWebView\Application\msedgewebview2.exe');
end;
  1. Правильное время инициализации: Инициализируйте WebView после полной загрузки формы, например в OnShow:
procedure TForm1.FormShow(Sender: TObject);
begin
  if not EdgeBrowser1.Initialized then
    EdgeBrowser1.CreateWebView;
end;
  1. Обработка ошибок восстановления: Реализуйте механизм восстановления после сбоев:
procedure TForm1.RecoverFromWebViewFailure;
begin
  try
    EdgeBrowser1.Free;
    EdgeBrowser1 := TEdgeBrowser.Create(Self);
    EdgeBrowser1.Parent := Self;
    EdgeBrowser1.Align := alClient;
    EdgeBrowser1.OnCreateWebViewCompleted := WebBrowserCreateWebViewCompleted;
    EdgeBrowser1.CreateWebView;
  except
    on E: Exception do
      ShowMessage('Не удалось восстановить WebView: ' + E.Message);
  end;
end;

Заключение

Проблема с ошибкой HRESULT -2147023496 в TEdgeBrowser может быть решена несколькими способами: от простых попыток перезапуска инициализации до использования альтернативных библиотек, таких как WebView4Delphi. Важно правильно обрабатывать ошибки и предусматривать механизмы восстановления для повышения стабильности приложения.

Если проблема сохраняется, стоит проверить обновления для WebView2 Runtime и самой Delphi, так как Embarcadero регулярно выпускает обновления для компонента TEdgeBrowser.

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

Статья описывает решение проблемы с ошибкой HRESULT -2147023496 при инициализации WebView2 в Delphi, предлагая несколько методов её устранения, включая перезапуск инициализации и использование альтернативной библиотеки WebView4Delphi.


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

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




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


:: Главная :: Ошибки и Исключения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-23 03:03:19/0.0061330795288086/0