Форум: "Основная";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
ВнизДоступ к документу FireFox Найти похожие ветки
← →
RAN-II © (2010-04-28 15:44) [0]Доброго времени суток!
Появилась необходимость получить из моей программы доступ к документу открытому в FireFox, вернее к веб-форме документа (нужно реализовать чтение и запись значений в поля формы, как в RoboForm и ему подобных). Но как "достучаться" до него ума не приложу... При этом крайне не желательно использование расширений для FF.
Буду благодарен за любую помощь по этой проблеме.
← →
Сергей М. © (2010-04-28 23:22) [1]Кури Gecko SDK.
Если, конечно, у тебя хватит терпения выкурить хотя бы его четверть)
← →
Плохиш © (2010-04-29 10:18) [2]Прикольно, филиал гугля в отпуске... Где ж они, защитники немощных и обездоленных?
PS. В мировой помойке требуемой информации море.
← →
sniknik © (2010-04-29 11:56) [3]> Кури Gecko SDK.
а толку? так он сможет использовать движок (написать свой браузер на его основе), но не получит доступа к программе FireFox, документу в нем открытому.
← →
Сергей М. © (2010-04-29 12:00) [4]
> sniknik © (29.04.10 11:56) [3]
Еще как получит.
Достаточно всего лишь получть тем или иным образом управление в ВАП экз-ра Файрфокса.
← →
Сергей М. © (2010-04-29 12:07) [5]Пляска с бубном начинается от раннего перехвата ряда необходимых вызовов ф-ций NS_GetXXXXX, экспортируемых модулем xpcom.dll, который использует любой продукт на базе Геко-движка, в т.ч. и в 1-ю очередь Файрфокс.
← →
sniknik © (2010-04-29 12:22) [6]понятно. хотя и не очень...
у меня есть прога (просто есть, я ее не писал) которая использует движок Геко (превью), так вот у нее и у мозилы определяются разные версии движка, из чего я и решил, что это не типа ActivX с единым "центром", а просто набор обычных dll подкладываемых непосредственно к проге.
но судя по твоему ответу, свои dll мазила держит в системе, и подразумевается подключение именно к ним.
← →
Сергей М. © (2010-04-29 12:57) [7]
> sniknik © (29.04.10 12:22) [6]
> у нее и у мозилы определяются разные версии движка
Ну и что ?
Прога просто пользует свой отдельный комплект модулей в составе экз-ра движка. Собственно и в мозилловом зоопарке (Лис, Обезьян, Птица и иже с ними) каждый продукт содержит свою автономную (иногда усеченную) копию движка, с той лишь разницей что продукты эти при обновлении обновляют и модули своей копии движка.
← →
RAN-II © (2010-04-29 18:23) [8]А не нельзя ли получить доступ через какие-либо интерфейсы? Например через IAccessible у меня получилось прочитать строку текста под указателем мыши, но с полями ввода этот способ не сработал... (да и вроде FF не поддерживает в этом интерфейсе метод SetValue, т.е. записать в поле не получится)
← →
Сергей М. © (2010-04-29 21:43) [9]
> RAN-II © (29.04.10 18:23) [8]
Весь Геко СДК - это вдоль и поперек сплошные интерфейсы.
← →
RAN-II © (2010-04-29 22:24) [10]На сколько понял из описаний, доступ к документу нужно начинать с окна MozillaContentWindowClass. Но как получить указатель на интерфейс документа nsIDOMDocument из SDK (особенно учитывая, что гековские интерфейсы не зарегистрированы в системе)? Пытался перейти от IAccessible, но ничего не получилось (идея немного бредовая, но лучше пока не придумал -- с интерфейсами только недавно начал разбираться)
← →
Сергей М. © (2010-04-29 22:36) [11]> как получить указатель на интерфейс документа nsIDOMDocument
Сказано же - нужно получить управление в ВАП FF-процесса.
Чем раньше, тем лучше.
В идеале - не позднее самого первого его обращения к xpcom.dll
> гековские интерфейсы не зарегистрированы в системе
Что они там забыли, в системе ?
Сама идеология Геко-движка базируется на независимости от платформы.
Значит ни о каком виндовом реестре и тем паче ни о какой-то там регистрации не может идти и речи.
← →
RAN-II © (2010-05-05 14:48) [12]Сергей М.
Я смог загрузить свой код в ВАП FF (загружаю свою dll"ку), но при попытке получить интерфейс через nsIInterfaceRequestor падает FF (проверял с IAccessible -- работает корректно).
Падает в момент выполнения первой же строки
IntReq.GetInterface(NS_IDOMWINDOW_IID,DOMWnd);
где IntReq:nsIInterfaceRequestor; DOMWnd:nsIDOMWindow;
Что я делаю не так? Каким образом можно получить указатель на нужный интерфейс?.. (если что не так, сильно не бейте -- я только учусь :) )
← →
Сергей М. © (2010-05-05 16:21) [13]Показывай код, который ты внедрил, и самс код внедрения ..
← →
RAN-II © (2010-05-05 17:15) [14]Dll"ка почти пустая - "споткнулся" на первом же шаге
library TryXPCOMDLL;
uses
nsXPCOM, nsTypes, nsGeckoStrings, nsError, Classes, Windows, Dialogs;
{$R *.res}
var
IntReq:nsIInterfaceRequestor;
DOMWnd:nsIDOMWindow;
DOMDoc:nsIDOMDocument;
begin
Try
IntReq.GetInterface(NS_IDOMWINDOW_IID,DOMWnd);
Showmessage("!!!");
Except
Showmessage("No NS_IDOMWINDOW_IID");
End
end.
Для "иньекции" пока использую модуль advApiHook (был тут http://ms-rem.narod.ru/hook/ApiHook2/files/advApiHook.rar)
uses
Windows,SysUtils,Dialogs,advApiHook,Tlhelp32;
var
sFile: dword;
Size: dword;
Buff: pointer;
BytesReaded: dword;
PID:DWord;
Process:THandle;
function GetPID(ExeFileName: string): dword;
var
ContinueLoop: boolean;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
UpEFN: string;
begin
result:= 0;
UpEFN:= UpperCase(ExeFileName);
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpEFN)
or (UpperCase(FProcessEntry32.szExeFile) = UpEFN)) then
begin
result := FProcessEntry32.th32ProcessID;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
begin
PID:=GetPID("firefox.exe");
Process:=OpenProcess(PROCESS_ALL_ACCESS or PROCESS_VM_WRITE,
true, PID);
sFile := CreateFile("TryXPCOMDLL.dll", GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0);
Size := GetFileSize(sFile, nil);
GetMem(Buff, Size);
ReadFile(sFile, Buff^, Size, BytesReaded, nil);
CloseHandle(sFile);
InjectDllEx(Process, Buff); {из advApiHook}
FreeMem(Buff);
end.
Внедряется успешно, т.к. сообщения выдаются от имени FF
← →
RAN-II © (2010-05-05 17:19) [15]Прошу прощения, ссылка не та...
http://www.wasm.ru/pub/21/files/advapihook.rar
← →
Сергей М. © (2010-05-05 18:40) [16]
> IntReq.GetInterface(NS_IDOMWINDOW_IID,DOMWnd);
Ну и откуда у тебя в переменной IntReq взялась валидная интерфейсная ссылка ?
← →
RAN-II © (2010-05-06 11:41) [17]В том-то и дело, что ее нет... :(
Просто я никак не могу понять, как сделать первый шаг в получении ссылки. Нужно за что-то "зацепиться", но за что?
← →
Сергей М. © (2010-05-06 12:19) [18]За наиболее ранний перехват вызова ФайрФоксом ф-ции NS_GetServiceManager в составе xpcom.dll
← →
RAN-II © (2010-05-12 15:55) [19]Перехват срабатывает, но при вызове NS_GetServiceManager он мне возвращает нулевой указатель и результат выполнения NS_ERROR_FAILURE...
При загрузке dll хук ставлю такHookProc("XPCOM.dll","NS_GetServiceManager",@NS_GetSrvcMan,OldPrc);
...
function NS_GetSrvcMan(out aResult: nsIServiceManager ):nsResult; cdecl;
var
arr:nsIArray;
begin
if not flStarted then
Try
flStarted:=True;
Showmessage("aResult before NS_GET... "+Inttostr(Integer(aResult)));
Result:=NS_GetServiceManager(aResult); {из nsInit}
Showmessage("nsResult "+Inttostr(Result));
Showmessage("aResult after NS_GET... "+Inttostr(Integer(aResult)));
Except
ShowMessage("Exception!!!");
Result:=NS_ERROR_FAILURE;
End
else
flStarted:=False;
end;
HookProc все из того же advApiHook
В чем может быть дело?
И еще вопрос. Есть ли способ пробиться к документу, кроме перехвата NS_GetServiceManager? Такой способ немного не подходит тем, что NS_GET... вызывается только при открытии страницы. А как быть с документом, который уже был открыт?.. (FF может быть запущен до моей проги, а создание новой вкладки с документом для вызова NS_GET... как-то выглядит "кривовато")
← →
Сергей М. © (2010-05-12 16:09) [20]
> cdecl
С какого перепугу cdecl-то ?
← →
RAN-II © (2010-05-12 16:17) [21]Думаю с того, что в SDK функция NS_GetServiceManager описана именно с ним, а замещающая вроде должна соответствовать перехватываемой (вроде так)...
function NS_GetServiceManager(out servMgr: nsIServiceManager): nsresult; cdecl;
← →
Сергей М. © (2010-05-12 16:35) [22]
> RAN-II © (12.05.10 16:17) [21]
Пардон, действительно cdecl.
← →
RAN-II © (2010-05-12 16:52) [23]
> Сергей М. © (12.05.10 16:35) [22]
Ничего страшного -- бывает.
По поводу NS_GET... Каюсь -- упустил важную часть, забыл инициировать XPCOMGlue (предположил, что раз работаем в ВАП FF, то и инициация не нужна)
После добавления XPCOMGlueStartup("xpcom.dll"); перед установкой хука, NS_GET... заработал. Буду дальше ковырять.
← →
RAN-II © (2010-05-14 13:52) [24]NS_Get... Оказывается можно и не перехватывать. Вполне корректно срабатывает просто вызов этой функции в любой момент (по крайней мере в FF 3.0.5).
Возник еще вопрос...
Делаю без перехвата. Добираюсь до вкладки с документом, получаю список объектов по тегу (беру тег "input"). Каждый элемент списка типа nsIDOMNode. При попытке получить имя он выдает название тега, а значение - пустая строка. (с хуком результат тот же)DOMList:nsIDOMNodeList;
Str:String;
nsStr:nsAString;
WStr:PWideChar;
...
for i:=0 to ListLength do
begin
DOMList.Item(i).GetNodeName(nsStr);
NS_StringGetData(nsStr,WStr);
Str:=Str+WStr+" *** ";
DOMList.Item(i).GetNodeValue(nsStr);
NS_StringGetData(nsStr,WStr);
Str:=Str+WStr+#13;
end;
В результате нечто такое:
INPUT ***
INPUT ***
...
INPUT ***
И так по кол-ву объектов
По какой причине может не срабатывать? Может есть какая-нибудь особенность у nsIDOMNode или nsAString, которые я мог упустить?
← →
Сергей М. © (2010-05-14 21:56) [25]Ты отдаешь себе отчет в том что DOM от Геко и DOM от Майкрософт имеют весьма ощутимые отличия ?
← →
RAN-II © (2010-05-17 11:45) [26]Вообще-то да, но на мой взгляд, если в интерфейсе описан метод, то он должен работать... Вопрос только в том, на сколько корректно я им пользуюсь.
← →
Сергей М. © (2010-05-18 12:39) [27]> он должен работать
он и работает.
Но не так как ты себе представляешь его работу для MSDOM-реализации.
← →
RAN-II © (2010-05-18 13:42) [28]
> Но не так как ты себе представляешь...
В таком случае, можно чуть подробнее о его работе?.. (или где можно прочитать более-менее вразумительное описание)
Попытался "вручную" добраться до элементов документа, через ChildNodes, но максимум, что вытянул -- текст комментариев. Текстовые поля, если и возвращают что-либо, то в виде строки из пробелов...
При попытке получить список дочерних элементов для тега DIV падает FF (хотя HasChildNodes для него True).
FF озадачивает все больше и больше :)
← →
RAN-II © (2010-05-20 15:57) [29]Разобрался с основной массой вопросов...
Получилось вытянуть все значения тегов, кроме текущего значения Input типа Text. Постоянно возвращает значение, которое было при загрузке документа, а введенное пользователем не возвращает (т.е. возвращает то, что прописано в коде документа, а не реально введено в поле). Что можно сделать в данной ситуации?
← →
RAN-II © (2010-05-21 12:53) [30]Спасибо Сергею М. за дельные советы! Мозилла побеждена :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c