Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.27;
Скачать: CL | DM;

Вниз

Доступ к документу 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.01 c
15-1312489794
Юрий
2011-08-05 00:29
2011.11.27
С днем рождения ! 5 августа 2011 пятница


1-1274184511
Леонид Федьков
2010-05-18 16:08
2011.11.27
Работа с собственными службами


2-1312652888
Gu
2011-08-06 21:48
2011.11.27
Динамический массив


15-1312122736
TUser
2011-07-31 18:32
2011.11.27
И еще раз про эбонит с шерстью


2-1312129640
From4pda
2011-07-31 20:27
2011.11.27
выбор диска для копирования