Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизChromium Embedded подскажите Найти похожие ветки
← →
Rasta (2012-02-12 18:10) [0]Подскажите пожалуйста как в Chromium Embedded получить список url которые подгружаются в данный момент и увидеть что приходит в ответ с сервера.
← →
Rasta (2012-02-12 18:40) [1]Вроде установил все правильно. Добавил все папки. Запустил DCEF_D7.dpk скомпилировал и установил. Но если делаю обработку любого события выходит ошибки
[Error] Unit1.pas(14): Undeclared identifier: "ICefBrowser"
[Error] Unit1.pas(14): Undeclared identifier: "ICefFrame"
[Error] Unit1.pas(15): Undeclared identifier: "ustring"
В чем проблема? Использую Delphi 7 Lite Full Edition 7.3.4.3
← →
brother © (2012-02-12 19:11) [2]я бы начал с переустановки НОРМАЛЬНОЙ делфи...
← →
DVM © (2012-02-12 20:04) [3]
> как в Chromium Embedded получить список url которые подгружаются
> в данный момент
OnBeforeResourceLoad кажется событие назвается, там можно поймать абсолютно все URL которые браузер собирается загружать.
> и увидеть что приходит в ответ с сервера.
OnResourceResponse вероятно.
> Вроде установил все правильно. Добавил все папки.
Значит не все. А вообще правильно сказали, поставь нормальную версию Delphi а не огрызок.
← →
Rasta (2012-02-12 21:08) [4]Поставил нормальный Delphi. Качал с трекера одного.
При любом событии в данном случае на OnBeforeResourceLoad вываливаются ошибки
[Error] Unit1.pas(13): Undeclared identifier: "ICefBrowser"
[Error] Unit1.pas(14): Undeclared identifier: "ICefRequest"
[Error] Unit1.pas(14): Undeclared identifier: "ustring"
[Error] Unit1.pas(15): Undeclared identifier: "ICefStreamReader"
[Error] Unit1.pas(15): Undeclared identifier: "ICefResponse"
В чем все таки проблема? Может я не так как то ставлю?
← →
Rasta (2012-02-12 21:14) [5]Прошу прощения за ложную тревогу. Ошибка понял в чем. При помещении на форму компонента не добавлялась библиотека ceflib.
← →
Rasta (2012-02-12 22:16) [6]Большое спасибо тем кто ответил выше)
Список url к который подгружает браузер получаю в событии OnResourseResponse.
Выглядит так.
procedure TForm1.test(Sender: TObject; const browser: ICefBrowser;
const url: ustring; const response: ICefResponse; var filter: ICefBase);
begin
if(url<>"") then Memo1.Lines.Add(url);
end;
Но вот ответ не могу получить. Как понимаю он в Response но как преобразовать ICefResponse в String? Гугол ответа не дал :( Надеюсь на ваш совет гуру )
← →
sniknik © (2012-02-12 22:22) [7]> но как преобразовать ICefResponse в String?
а никак, т.к. судя по началу типа I, это интерфейс. он в стринг не преобразовывается.
← →
DVM © (2012-02-12 22:40) [8]
> Rasta (12.02.12 22:16) [6]
> if(url<>"") then Memo1.Lines.Add(url);
тут будь осторожен, возможно данное событие генерируется в доп потоке, обращаться из которого к интерфейсу программы нежелательно напрямую. Проверь GetCurrentThreadID у основного потока программы и в этом событии, одинаковые?
> но как преобразовать ICefResponse в String?
в нем нет данных которые браузер загрузил
> Надеюсь на ваш совет
надо подумать
← →
DVM © (2012-02-12 22:45) [9]
> Rasta (12.02.12 22:16) [6]
Если тебе нужны сами данные, то вероятно придется обрабатывать OnGetDownloadHandler, там есть handler: ICefDownloadHandler, а у него есть ReceivedData() там кусок данных (но не все данные). Также там есть
const mimeType, fileName: ustring; contentLength: Int64;
В принципе этого достаточно, чтобы сохранять скажем куда то, все что браузер загружает.
← →
Rasta (2012-02-12 22:53) [10]Спасибо за подробный ответ. Буду разбираться.
Всегда помогаете в нужную минуту )
← →
DVM © (2012-02-12 22:54) [11]
> Rasta (12.02.12 22:53) [10]
Хотя я наверное тебя обманул с OnGetDownloadHandler. Через него пройдут только загружаемые браузером файлы. Вот так его использовать:
procedure TMainForm.crmGetDownloadHandler(Sender: TObject;
const browser: ICefBrowser; const mimeType, fileName: ustring;
contentLength: Int64; var handler: ICefDownloadHandler; out Result: Boolean);
begin
SaveDialog.FileName := fileName;
if SaveDialog.Execute then
handler := TCefStreamDownloadHandler.Create(
TFileStream.Create(SaveDialog.FileName, fmCreate), true);
Result := True;
end;
← →
Rasta (2012-02-12 22:58) [12]Хотя скорее всего мне это не поможет. Т.к. событие OnGetDownloadHandler вызывается при скачке файла. А мне необходимо прочитать данные приходящие от сервера по определенному url. Если я повторно буду их загружать то сервер мне ничего не выдаст.
так что скорее всего проблема остаеться открытой )
← →
DVM © (2012-02-12 23:06) [13]
> А мне необходимо прочитать данные приходящие от сервера
> по определенному url.
Надо подумать. Дело в том, что в обертке TChromium для Delphi наружу вынесен не весь функционал Chromium Embedded. Надо поизучать внутренности его. Документации нет совсем, так что надо смотреть. Можно еще написать автору обертки (его контакты есть на google code) может присоветует что.
← →
DVM © (2012-02-12 23:22) [14]
> Rasta (12.02.12 22:53) [10]
Надо все таки работать в OnResourceResponse. Там есть некий параметр var filter: ICefBase
За ним скрывается:
on_resource_response: procedure(self: PCefRequestHandler;
browser: PCefBrowser; const url: PCefString;
response: PCefResponse; var filter: PCefContentFilter); stdcall;
TCefContentFilter = record
// Base structure.
base: TCefBase;
// Set |substitute_data| to the replacement for the data in |data| if data
// should be modified.
process_data: procedure(self: PCefContentFilter;
const data: Pointer; data_size: Integer;
var substitute_data: PCefStreamReader); stdcall;
// Called when there is no more data to be processed. It is expected that
// whatever data was retained in the last process_data() call, it should be
// returned now by setting |remainder| if appropriate.
drain: procedure(self: PCefContentFilter;
var remainder: PCefStreamReader); stdcall;
end;
Короче, добраться до загруженных данных можно.
← →
Rasta (2012-02-14 00:52) [15]В общем нашел на просторах их группы вот такой код для получения ответа от сервера. Но с данным кодом у меня программа не компилируется. Ругается access violation at address 00000000 read of address 00000000
procedure ss (const doc: ICefDomDocument);
var
q: string;
begin
q:= doc.Body.GetAsMarkup;
end;
procedure TForm1.ResourseResponse(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
begin
browser.MainFrame.VisitDomProc(ss);
end;
← →
sniknik © (2012-02-14 19:25) [16]и конечно ICefBrowser писан на дельфи и коллбек (это же он?) для VisitDomProc понимает дельфевские соглашения о вызовах.
← →
DVM © (2012-02-14 23:15) [17]TCefFastDomVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const document: ICefDomDocument);
← →
DVM © (2012-02-14 23:21) [18]
> Rasta (14.02.12 00:52) [15]
ты чего пытаешься от браузера получить то?
Если HTML код страницы так он и так после загрузки лежит в соответствующем свойстве браузера. VisitDomProc хоть и позволит обратиться к любому элементу на странице, но это не то, что загружал браузер. И нафига ты это все делаешь в ResourseResponse. ResourseResponse возникает многократно еще до загрузки страницы, никакими DOM там еще и не пахнет.
← →
Rasta (2012-02-15 12:45) [19]В каких таких свойствах браузера? Я все перерыл. Не могу найти и все тут. Вопрос на форуме официальном не дал толкового ответа. Т.к. говорят это не их продукт мол этим другие занимаются они тока версией под C++.
← →
Anatoly Podgoretsky © (2012-02-15 12:59) [20]> Rasta (15.02.2012 12:45:19) [19]
Что такое оффициальный сайт? и именно для хрониума?
← →
Rasta (2012-02-15 13:12) [21]Именно для хрониума. Официальный форум можно найти в гугле по слову magpcss.o. Не буду кидать ссыль сайта малоли это запрещено.
← →
DVM © (2012-02-15 13:14) [22]
> Rasta (15.02.12 12:45) [19]
> В каких таких свойствах браузера? Я все перерыл. Не могу
> найти и все тут.
HTML код лежит тут: TChromium.Browser.MainFrame.Source
Смотреть туда имеет смысл ПОСЛЕ прихода события OnLoadEnd
> Вопрос на форуме официальном не дал толкового ответа. Т.
> к. говорят это не их продукт мол этим другие занимаются
> они тока версией под C++.
Все вопросы тут: http://groups.google.com/group/delphichromiumembedded
← →
DVM © (2012-02-15 13:16) [23]
> Rasta (15.02.12 13:12) [21]
> Именно для хрониума.
Ты различай Chromium (браузер), Chromium Embedded (библиотека, основа Chromium-а) и Chromium embedded Delphi Framework (обертка к Chromium Embedded)
← →
Anatoly Podgoretsky © (2012-02-15 13:46) [24]> Rasta (15.02.2012 13:12:21) [21]
И что нам за тебя поискать?
← →
Rasta (2012-02-15 14:25) [25]
> Что такое оффициальный сайт?
Вы спросили я ответил.
С этим компонентом у меня какие то странности.
Выбивает ошибки как тока я обращаюсь в MainFrame в не зависимости откуда. К примеру на код
procedure TClientos.btn1Click(Sender: TObject);
var
URL:string;
begin
URL := edt1.Text;
chrm1.Browser.MainFrame.LoadUrl(URL);
end;
Ошибка Access violation at address 00467557 in module "Project1.exe". Read of address 00000000.
← →
DVM © (2012-02-15 18:06) [26]
> chrm1.Browser.MainFrame.LoadUrl(URL);
так нельзя
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.062 c