fpCEF3

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Re: fpCEF3

Сообщение mgear » 28.04.2017 16:26:15

Снег Север, ну для винды в целях более широкой совместимости мне всё же следует ориентироваться на 32 бита. Для себя-то, любимого, можно и 64, но для людей надо или только 32, или 32+64. Это программа - сборщик информации с интернет-ресурсов, сведением в базу и выборками. Ориентировался на голый хтмыл и начал на перле делать, но упёрся в то, что некоторые сайты хотят жаба скрипт, да ещё и взаимодействие с юзером. Хорошо, что недавно только начал делать и ещё не успел гигабайтищи кода наковырять.

Странно, что так мало ресурсов по Delphi/FPC+CEF3. Вероятно, это связано с малой вообще популярностью этих языков. Но я кое-что уже сам наковырял из исходников. Например, теперь умею ажнык двумя способами вынимать текст из браузера: через GetSourceProc и GetSource.

GetSource лучше тем, что в обработчик можно параметры передавать. Странновато, что процедура в GetSourceProc объявлена как единственный стринг без доп. параметров.

Ну и про передачу сообщений, вроде бы, разобрался. Там, по сути, идеологически не особо сложно: в API задействованы всего два PID-а, BROWSER и RENDERER. Проблема в организации безглючного взаимодействии процессов и отладке.

Код: Выделить всё
procedure StringVisitor(const str: ustring);
begin
  MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
  MainForm.Memo1.Lines.Text := str;
end;

procedure TMainForm.crmLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
  res:boolean;
begin
  if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
    crm.Browser.MainFrame.GetSourceProc(@StringVisitor);
end;


Код: Выделить всё
  TCefStringVisitor = class(TCefStringVisitorOwn)
  private
    FBrowser: ICefBrowser;
  protected
    procedure Visit(const str: ustring); override;
    constructor Create(const browser: ICefBrowser);
  end;

procedure TCefStringVisitor.Visit(const str: ustring);
begin
  MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
  MainForm.Memo1.Lines.Text := str;
end;

constructor TCefStringVisitor.Create(const browser: ICefBrowser);
begin
  inherited Create;
  FBrowser := browser;
end;

procedure TMainForm.crmLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
  res:boolean;
begin
  if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
    crm.Browser.MainFrame.GetSource(TCefStringVisitor.Create(Browser));
end;
Последний раз редактировалось mgear 28.04.2017 16:38:39, всего редактировалось 1 раз.
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Re: fpCEF3

Сообщение Снег Север » 28.04.2017 16:35:52

В той версии хромиума под делфи которую использовал я (не самая последняя, но достаточно стабильная, а постоянные изменения интерфейса к хромиуму от версии к версии меня задолбали) текст вынимается callback процедурой. И у нас эти программы внутреннего пользования, так что они всегда запускаются на серверах где 32 бита не бывает уже лет пятнадцать...
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 947
Зарегистрирован: 27.11.2007 16:14:47

Re: fpCEF3

Сообщение mgear » 28.04.2017 16:57:07

Снег Север писал(а):текст вынимается callback процедурой

Наверняка в вашей версии хромиума есть и GetSource.

Для коллбэков в fpCEF3 сделаны обёртки с названиями TCef...XXXOwn. Это паскалевские реализации апишных интерфейсов ICef...XXXHandler, ICef...YYYVisitor и т.д.
Код: Выделить всё
grep -i "t.*own =" *.pas


То есть, по сути, обработка всяческой фигни сводится к поиску подходящего родительского класса и написанию примитивной обёртки вокруг него с переписанными одним-двумя методами.

Проблемка, конечно, в том, что нет даже не то что нормальных, а хоть сколько-то осмысленных доков.

P.S. Так долго объяснял, что аж сам понял :mrgreen: :mrgreen: :mrgreen:

Кароч вот как надо действовать. В API есть обработчики ICefXXX. Вокруг них навёрнуты реализации, возможно, заглушки.
Вот все они. Точнее, надеюсь, что все:
Код: Выделить всё
grep -n "class.*, ICef" *.pas


Классы TCef...Own - базовые обёртки интерфейсов, а-ля абстрактные классы, только рабочие методы из каких-то соображений не описаны как abstract. В некоторых случаях вокруг них уже написаны рабочие классы.

Мой класс TCefStringVisitor основан на TCefStringVisitorOwn, где рабочий метод Visit описан как "begin end". Также в cef3own описан "полноценный" класс TCefFastStringVisitor, только мне он не понравился. Даже не понимаю, нафига он вообще нужен такой красивый.
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Пред.

Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru