powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Chromium cef3 в отдельном потоке
25 сообщений из 81, страница 2 из 4
Chromium cef3 в отдельном потоке
    #39302839
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Наверно так же. как из из других коллбеков.
например, при работе с EnumWindows
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303051
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если через глобальную переменную и Event+WaitForSingleObject?
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303122
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiПричем задача нерешаемая в принципе.

используя пример из этого кода
http://prog-example.ru/twebbrowser/nevidimyj-brauzer-twebbrowser-v-potoke/
получилось реализовать синхронный режим с TWebBrowser, вернее с IWebBrowser2.

объявляю 2 глобальные переменные
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
...
var
    FEvent: THandle;
    sDocumentCompleteResult: string;

implementation

...




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function TParse.GetDocumentInnerHTML(const url: string): string;
      procedure ResultCallback(text: PWideChar);
      begin
         sDocumentCompleteResult := WideCharToString(text);
         SetEvent( FEvent);
      end;
var
  Command: TWebBrowserCommand;
begin
  Command.Number          := CMD_NAVIGATE;
  Command.Parameter       := PChar(url);
  Command.ResultCallback  := @ResultCallback;

//запускаем navigate
  SendCommandToWebBrowser(FWebBrowserContainer1, @Command);

//ждём
  WaitForSingleObject(FEvent, INFINITE);// вместо INFINITE можно вставить интервал времени ожидания, на случай зависания - timeout

  result := sDocumentCompleteResult;
  CloseHandle(FEvent);
end;





и вот так используем
Код: pascal
1.
2.
    FEvent := CreateEvent(nil, false, false, nil);
    pagecontent := GetDocumentInnerHTML(url);
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303144
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, вот, что выдаёт невидимый браузер
Не удается отобразить эту страницу
Убедитесь, что веб-адрес http://h правильный.
Найдите страницу с помощью поисковой системы.
Обновите страницу через несколько минут.

где-то я ошибся
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303148
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя сам пример работает номрально
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303153
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно вот так в юникодной версии Delphi:
Код: pascal
1.
  Command.Parameter :=   Command.Parameter := PAnsiChar(AnsiString(sURL));
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303157
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
невидимый браузер выдаёт видимые сообщения

типа


хотя если открыть ссылку непосредственно в Internet Explorer, то никаких ошибок и сообщений нет

поэтому нужно добавить где-нибудь
Код: pascal
1.
Container^.WebBrowser.Silent := True;
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303159
Фотография Lexus34
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а что мешает создать отдельный юнит TThread заюзать глобальную переменную GET запроса и копить в стриноговом буфере (или какой там тип данных), потом обрабатывать если надо что там за выхлоп. Вот проблема ппц.
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303319
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11невидимый браузер выдаёт видимые сообщения

типа


хотя если открыть ссылку непосредственно в Internet Explorer, то никаких ошибок и сообщений нет

поэтому нужно добавить где-нибудь
Код: pascal
1.
Container^.WebBrowser.Silent := True;



Hint: Internet Explorer и TWebbrowser - немного разные программы, точнее - разные интерфейсы одной программы. Поэтому то, что работает в IE совсем не обязательно будет нормально работать в WebBrowser.
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303320
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303336
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

WebBrowser по умолчанию запускается в режиме совместимости с IE 7, в то время как Internet Explorer - Edge, те последняя доступная версия
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303339
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, а как дать понять браузеру WebBrowser, чтобы он запускался в "нормальном" режиме?
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303372
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303429
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

ага, понял
добавил свою программу - всё равно вываливается Ошибка сценария
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303430
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поспешил )))
всё ок, уже нет сообщений об ошибках
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303471
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё прошу помочь с этой процедурой.
этот пример
http://prog-example.ru/twebbrowser/nevidimyj-brauzer-twebbrowser-v-potoke/
скорее всего написан для неюникодной версии Delphi, поэтому он не на 100% рабочий


Вот, например, процедура:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function MsgOnlyWindowProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  Container: PWebBrowserContainer;
  Command: PWebBrowserCommand;
begin
  case uMsg of
    WM_USER:
    begin
      Container := PWebBrowserContainer(wParam);
      Command   := PWebBrowserCommand(lParam);

      case Command^.Number of
        CMD_NAVIGATE:
        begin
//          Container^.WebBrowser.Silent := True;
          Container^.WebBrowser.Navigate(PAnsiChar(Command^.Parameter), EmptyParam, EmptyParam, EmptyParam, EmptyParam);
          while (Container^.WebBrowser.ReadyState <> READYSTATE_COMPLETE) do
          begin
            Application.ProcessMessages;
            Sleep(1);
          end;
          Command^.ResultCallback(PWideChar((Container^.WebBrowser.Document as IHTMLDocument2).body.outerHTML));
        end;

      end;
    end;
  else
    Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
    Exit;
  end;
  Result := 1;
end;



Первый параметр в Navigate должен быть не PAnsiChar, а PWideChar. Поэтому Delphi выдаёт warning, но работает.
А если передавать PWideChar, то вываливается EOleException "Неизвестная ошибка".
Так вот, как правильно переписать эту строку?
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303473
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой Warning:
Implicit string cast from 'AnsiChar' to 'WideString'

переделал так:
Код: pascal
1.
Container^.WebBrowser.Navigate(WideString(PAnsiChar(Command^.Parameter)), EmptyParam, EmptyParam, EmptyParam, EmptyParam);
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303474
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и Event log внизу часто выдаёт:
Event logDebug Output:
Invalid parameter passed to C runtime function.
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303628
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
3.
Command.Parameter := PWideChar('http://ya.ru');
..
Container^.WebBrowser.Navigate(PWideChar(Command^.Parameter), EmptyParam, EmptyParam, EmptyParam, EmptyParam);


?
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303669
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то же самое - неопознанная ошибка
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303684
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё проблема в том, что в этом месте код виснет

Код: pascal
1.
2.
3.
4.
5.
          while (Container^.WebBrowser.ReadyState <> READYSTATE_COMPLETE) do
          begin
            Application.ProcessMessages;
            Sleep(1);
          end;



т.к. ReadyState не возвращает READYSTATE_COMPLETE очень долгое время
скорее всего из-за того, что WebBrowser считает, что страничка загружена не до конца
нужно мастырить какой-то timeout

Может быть виснет из-за того, что какой-то ActiveX объект не загрузился или JS не выполнился.
Хотя если открывать тот же самый URL непосредственно в IE 11, то страница ( основная часть, шаблон) грузится быстро, 2-3 сек, после чего начинается выполнение внутреннего JS и страница наполняется контентом, но тоже быстро. И нет такого, что индикатор загрузки постоянно или очень долго крутится.
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303694
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

было такое, когда веббраузер не отображался, пока не покажешь его - состояние не менялось... пришлось переделать работу на после показа...
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303703
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

не понял..
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303713
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11не понял..
Говорит, пока не покажешь браузер (не дашь ему прорисоваться), состояние не меняется.
Zeliusпока не покажешь его - состояние не менялось...
...
Рейтинг: 0 / 0
Chromium cef3 в отдельном потоке
    #39303714
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

пришлось перенести обработку страницы из OnCreate формы на показ и определение State = READYSTATE_COMPLETE по таймеру
...
Рейтинг: 0 / 0
25 сообщений из 81, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Chromium cef3 в отдельном потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]