![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к документу FireFox
RAN-II © (2010-04-28 15:44:00)Доброго времени суток!
Появилась необходимость получить из моей программы доступ к документу открытому в FireFox, вернее к веб-форме документа (нужно реализовать чтение и запись значений в поля формы, как в RoboForm и ему подобных). Но как "достучаться" до него ума не приложу... При этом крайне не желательно использование расширений для FF.
Буду благодарен за любую помощь по этой проблеме.
RAN-II (2010-05-21 12:53:00) [1]Спасибо Сергею М. за дельные советы! Мозилла побеждена :)
RAN-II (2010-05-20 15:57:00) [2]Разобрался с основной массой вопросов...
Получилось вытянуть все значения тегов, кроме текущего значения Input типа Text. Постоянно возвращает значение, которое было при загрузке документа, а введенное пользователем не возвращает (т.е. возвращает то, что прописано в коде документа, а не реально введено в поле). Что можно сделать в данной ситуации?
RAN-II (2010-05-18 13:42:00) [3]
> Но не так как ты себе представляешь...
В таком случае, можно чуть подробнее о его работе?.. (или где можно прочитать более-менее вразумительное описание)
Попытался "вручную" добраться до элементов документа, через ChildNodes, но максимум, что вытянул -- текст комментариев. Текстовые поля, если и возвращают что-либо, то в виде строки из пробелов...
При попытке получить список дочерних элементов для тега DIV падает FF (хотя HasChildNodes для него True).
FF озадачивает все больше и больше :)
Сергей М. (2010-05-18 12:39:00) [4]> он должен работать
он и работает.
Но не так как ты себе представляешь его работу для MSDOM-реализации.
RAN-II (2010-05-17 11:45:00) [5]Вообще-то да, но на мой взгляд, если в интерфейсе описан метод, то он должен работать... Вопрос только в том, на сколько корректно я им пользуюсь.
Сергей М. (2010-05-14 21:56:00) [6]Ты отдаешь себе отчет в том что DOM от Геко и DOM от Майкрософт имеют весьма ощутимые отличия ?
RAN-II (2010-05-14 13:52:00) [7]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, которые я мог упустить?
RAN-II (2010-05-12 16:52:00) [8]
> Сергей М. © (12.05.10 16:35) [22]
Ничего страшного -- бывает.
По поводу NS_GET... Каюсь -- упустил важную часть, забыл инициировать XPCOMGlue (предположил, что раз работаем в ВАП FF, то и инициация не нужна)
После добавления XPCOMGlueStartup('xpcom.dll'); перед установкой хука, NS_GET... заработал. Буду дальше ковырять.
Сергей М. (2010-05-12 16:35:00) [9]
> RAN-II © (12.05.10 16:17) [21]
Пардон, действительно cdecl.
RAN-II (2010-05-12 16:17:00) [10]Думаю с того, что в SDK функция NS_GetServiceManager описана именно с ним, а замещающая вроде должна соответствовать перехватываемой (вроде так)...
function NS_GetServiceManager(out servMgr: nsIServiceManager): nsresult; cdecl;
Сергей М. (2010-05-12 16:09:00) [11]
> cdecl
С какого перепугу cdecl-то ?
RAN-II (2010-05-12 15:55:00) [12]Перехват срабатывает, но при вызове 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-06 12:19:00) [13]За наиболее ранний перехват вызова ФайрФоксом ф-ции NS_GetServiceManager в составе xpcom.dll
RAN-II (2010-05-06 11:41:00) [14]В том-то и дело, что ее нет... :(
Просто я никак не могу понять, как сделать первый шаг в получении ссылки. Нужно за что-то "зацепиться", но за что?
Сергей М. (2010-05-05 18:40:00) [15]
> IntReq.GetInterface(NS_IDOMWINDOW_IID,DOMWnd);
Ну и откуда у тебя в переменной IntReq взялась валидная интерфейсная ссылка ?
RAN-II (2010-05-05 17:19:00) [16]Прошу прощения, ссылка не та...
http://www.wasm.ru/pub/21/files/advapihook.rar
RAN-II (2010-05-05 17:15:00) [17]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
Сергей М. (2010-05-05 16:21:00) [18]Показывай код, который ты внедрил, и самс код внедрения ..
RAN-II (2010-05-05 14:48:00) [19]Сергей М.
Я смог загрузить свой код в ВАП FF (загружаю свою dll'ку), но при попытке получить интерфейс через nsIInterfaceRequestor падает FF (проверял с IAccessible -- работает корректно).
Падает в момент выполнения первой же строки
IntReq.GetInterface(NS_IDOMWINDOW_IID,DOMWnd);
где IntReq:nsIInterfaceRequestor; DOMWnd:nsIDOMWindow;
Что я делаю не так? Каким образом можно получить указатель на нужный интерфейс?.. (если что не так, сильно не бейте -- я только учусь :) )
Сергей М. (2010-04-29 22:36:00) [20]> как получить указатель на интерфейс документа nsIDOMDocument
Сказано же - нужно получить управление в ВАП FF-процесса.
Чем раньше, тем лучше.
В идеале - не позднее самого первого его обращения к xpcom.dll
> гековские интерфейсы не зарегистрированы в системе
Что они там забыли, в системе ?
Сама идеология Геко-движка базируется на независимости от платформы.
Значит ни о каком виндовом реестре и тем паче ни о какой-то там регистрации не может идти и речи.