Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Доступ к документу FireFox


Страницы:   1 2

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


> гековские интерфейсы не зарегистрированы в системе


Что они там забыли, в системе ?
Сама идеология Геко-движка базируется на независимости от платформы.
Значит ни о каком виндовом реестре и тем паче ни о какой-то там регистрации не может идти и речи.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо