Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1312057797
Юрий
2011-07-31 00:29
2011.11.27
С днем рождения ! 31 июля 2011 воскресенье


2-1312641641
avi9526
2011-08-06 18:40
2011.11.27
Где находится функция прорисовки TCheckBox


2-1312739542
KLSA
2011-08-07 21:52
2011.11.27
Аля image editor


1-1271161706
Zoom
2010-04-13 16:28
2011.11.27
Загадка с Memo и TntMemo


15-1311711837
tesseract
2011-07-27 00:23
2011.11.27
Чтиво на отпуск.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский