4.3. Структура  C++ части проекта.

Данная часть была мною разработана для управления браузером и html объектами на загруженной в браузер странице.

Проект компилируется в динамическую библиотеку(dll),автоматически подгружаемую Internet Explorer.

На диаграмме использования показано,какие функции исполняют классы,входящие в эту часть проекта.

Класс CHelloWorldModule определяет, какой класс будет загружен дальше, и какой тип имеет загруженная в браузер dll.

Класс CHelloWorldBHO – запускает обработку команд java части, а также вызывается браузером для обработки событий браузера и документа.

Класс NetworkController –интерпретатор команд java части, методы этого класса используют COM –интерфейс браузера и дочерних объектов браузера  для выполнения команд. Кроме того, данный класс производит сохранение логов, если соответствующая команда была получена  от java части.


Рисунок 4.3.1. Диаграмма использования C++ классов проекта.

На диаграмме классов приведена более подробная структура этой части проекта.

В классе  CHelloWorldModule  реализованы методы для определения браузером типа dll и класса для обработки слбытий.

 Класс CHelloWorldBHO – это класс, методы которого вызываются для обработки событий, произошедших в браузере, таких, как был определен адрес загружаемой в браузер страницы, был полностью загружен документ в браузер, были произведены действия над объектами в загруженном в браузер документе, а именно:

1.Событие браузера onDocumentComplete,  (вызывается метод OnDocumentComplete)

2.События документа браузера OnMouseClick, OnMouseOver, OnFocusOut. (вызывается метод onEditorEdit)

. Для того, чтобы данную функцию исполнять, данный класс реализует несколько интерфейсов:

1. public CComObjectRootEx<CComSingleThreadModel>, -обработчик событий браузера в единственном потоке

2. public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>, - класс,методы которого можно вызывать через COM.

3. public IObjectWithSiteImpl<CHelloWorldBHO>,- обработчик события ”выбран сайт для загрузки”.

4. public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, - для реализации интерфейса диспатч(любой класс,с которым можно работать через COM,должен этот интерфейс реализовать)    .

5. public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>, -для того,чтобы класс мог обрабатывать события html объектов

6. public IDispEventSimpleImpl<0, CHelloWorldBHO, &DIID_HTMLDocumentEvents2> - и документа.

Кроме того, в этом  классе производится создание отдельного объекта, который будет исполнять команды java части и взаимодействовать с java частью по сети – класс NetworkController.

Работа класса NetworkController производится в новом потоке, который будет создан после первой полной загрузки документа в браузер.

В потоке,созданном при первой загрузке документа вызывается метод startListen() ,который открывает порт  со случайным номером и отправляет команду 0  по адресу localhost:8082.Далее, взаимодейтствие идет по “протоколу взаимодействия java и C++ частей”.

 

Обработка команд, отправляемых  java программой, осуществляется в методе perform Requests класса NetoworkController.Метод performRequest вызывает непосредственно метод, который отвечает за обработку команды.

Если  java программа не отозвалась, то  в методе startListen   UDP Socket  будет закрыт,в переменной  finished будет  сохранено,что класс работу закончил и  работа потока для обработки запросов java программы будет завершена.

Класс NetworkController содержит много вспомогательных методов для поиска html объектов в документе Internet Explorer ,а также для выполнения команд java части.

Помимо этого,он содержит 2 метода для  сохранения в логах действий пользователя:

logDocumentComplete и logEvent.


Рисунок 4.3.2. Диаграмма классов проекта.


 

При дальнейшей работе, класс CHelloWorldBHO используется для приема событий браузера onDocumentComplete, OnMouseClick, OnMouseOver, OnFocusOut .

4.4.Подробное описание методов и переменных классов.

Класс CHelloWorldModule

Класс,позволяющий определить браузеру тип библиотеки и  в котором определено,какой класс будет обрабатывать события Internet Explorer.

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

Первая функция,которая вызывается при загрузке dll модуля в Internet Explorer.В этой функции производится отключение вызова инициализации dll при подключении к каждому потоку Internet Explorer.

STDAPI DllCanUnloadNow(void)

Используется для определения,возможно ли выгрузить из OLE данный модуль.

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)

Возвращает объект класса “a class factory” ,используемый для создаиия экземпляра класса.

STDAPI DllRegisterServer(void)

DllRegisterServer добавляет запись в системный реестр.

STDAPI DllUnregisterServer(void)

DllUnregisterServer удаляет запись из системного реестра.

Класс CHelloWorldBHO.

Класс,в котором производится инициализация класса NetworkController и регистрируются обработчики нужных событий.

STDMETHOD(SetSite)(IUnknown *pUnkSite)

Метод будет вызван после  определения ,какой сайт будет загружен.В данном методе производится  подписка на событие “ondocumentcomplete” ,создание экземпляра класса NetworkController и  запуск потока,в котором будет выполняться  сетевое взаимодействие с java клиентом.

После полной загрузки Internet Explorer будет вызван метод setSite класса CHelloWorldBHO. В этом методе  определяется обработчик события OnDocumentComplete.

void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);

 

Метод вызывается  при возникновении события “документ полностью загружен в браузер”.

После  первой загруженной в Internet Explorer страницы (например, страницы по умолчанию “about:blank”) будет вызван данный метод ,в котором будет:

1.Создан новый  экземпляр класса NetworkController,в котором будет производиться обработка запросов java части программы.

2.Создан новый поток,в котором будут  обрабатываться все сетевые вызовы.

3.Зарегистрирован обработчик событий документа браузера OnMouseClick, OnMouseOver, OnFocusOut.

4.Также на этом этапе передается ссылка на web браузер в класс NetworkController (вызывается метод setBrowser).

 

Также,в этом методе обновляется ссылка на браузер в объекте NetworkController, производится подписка на события документа (“фокус потерян html объектом”,”пользователь кликнул по html объекту”,”пользователь навел курсор на html объект”).

VARIANT_BOOL STDMETHODCALLTYPE OnMouseClick(IDispatch* _pEvtObj);

Метод вызывается ,когда пользователь кликнул по html объекту.Производится вызов метода  logEvent класса NetworkController.

VARIANT_BOOL STDMETHODCALLTYPE OnMouseOver(IDispatch* _pEvtObj);

Метод вызывается,когда пользователь навел курсор мыши на  html объект. Производится вызов метода  logEvent класса NetworkController.

VARIANT_BOOL STDMETHODCALLTYPE OnEditorEdit(IDispatch * _pEvtobj);

Метод вызывается, когда  html объект теряет фокус ввода. Производится вызов метода  logEvent класса NetworkController.

Локальные переменные объекта:

CComPtr<IWebBrowser2>  m_spWebBrowser; //ссылка на текущий web браузер.

 

IHTMLEventObj* DocumentEventInfo; // объект для получения информации  о событии  документа.

HANDLE hThread; //cсылка на созданный поток.

DWORD dwThreadId; //ID созданного потока

BOOL m_fAdvised; //логическая переменная,содержит информацию, была ли уже осуществлена подписка на события Internet Explorer.

bool mouseAdvised;//Была ли осуществлена подписка на события документа.

NetworkController  *controller; //создаваемый экземпляр класса NetworkController

bool has_set_browser;  // был ли обновлен браузер в  объекте

Класс NetworkController.

Данный класс отвечает за сетевое взаимодействие с java частью,логирование действий пользователя,а также исполнение команд,отдаваемых  java частью. Все команды, кроме команд исполняемых в отдельном потоке (команды 13,14 исполняются в отдельном потоке) являются блокирующими.Это означает,что интерпретация команд продолжится только после завершения исполнения текущей команды.

Работа  объекта этого класса начинается с вызова метода startListen, в котором производится попытка соединиться с java частью в соответствии с протоколом взаимодействия.

Если попытка успехом не увенчалась, и java часть не отозвалась, то работа объекта на этом завершается. Если java часть ответила, объект переходит в состояние обработки команд java части, и вызывает для каждой команды свой обработчик. После завершения выполнения команды, объект возвращается в состояние обработки команд. Выход из этого состояния происходит только перед  завершением работы браузера.(перед завершением работы браузера будет взыван метод disconnect).


Рисунок 4.3.3. Диаграмма состояний класса NetworkController.

Вызов методов логирования (logDocuementComplete и logEvent) производится в основном потоке работы Internet Explorer.Будет ли событие сохранено в логе – определяет внутренняя переменная needRecord,которая принимает значения true после получения команды 17(начать логирование).

Далее,будет продробно описан каждый метод этого класса.

NetworkController(void);

Конструктор,в котором инициализируются  ряд переменных.

void startListen();

В данном методе осуществляется подключение к java программе.Если java программа вовремя не ответила,работа потока,отвечающего за сетевое взаимодействие с java программой будет завершена.

void disconnect();

Метод завершает цикл обработки команд  java программы.Будет вызван перед завершением работы  экземпляра Internet Explorer.В методе будет закрыт Socket,который прослушивается для получения команд от java программы,а также переменной  finished будет присвоено значение true.

public:

~NetworkController(void);

В деструкторе производится удаление объектов,созданных в конструкторе.

void setBrowser(LPVOID lpvoid);

Обновление сслылки на браузер.На вход передается ссылка на стрим,в который  был сериализован объект Dispatch.COM Объект “браузер” автоматически удаляется,после выхода из метода “ OnDocumentComplete ” класса HelloWorldBHO.Таким образом  компания Microsoft решила проблему потенциальной утечки памяти. Для того,чтобы COM объектом можно было воспользоваться в другом потоке,приходиться использовать механизм “marshaling”.Этот механизм заключается в том,что в потоке, из которого нужно передать объект, объект сериализуется в создаваемый операционной системой  stream функцией  CoMarshalInterThreadInterfaceInStream ,на вход которой подается  тип объекта , сериализуемый объект,и переменная,в которой будет сохранен создаваемый поток.

Далее, нужно передать в поток-получатель ссылку на созданный стрим. Ссылка может быть применена любым потоком  в пределах операционной системы.

В потоке-получателе  нужно вызвать функцию CoGetInterfaceAndReleaseStream ,которой на вход подается ссылка на стрим ,тип объекта, и переменная,в которую будет сохранена ссылка на COM объект.

bool sendOuterHTML(sockaddr* sendTo,int addrlen);

Метод обрабатывает команду 2 .Java клиенту отправляется html код текущего окна. На вход метод получает  адрес отправителя(java клиента) и длину адреса.Возвращаемое значение –возникали ли ошибки в ходе выполнения комианды.

bool sendXmlDomModel();

Метод обрабатывает команду 9 . Java клиенту отправляется XML, содержащая копию DOM модели Internet Explorer.Копируются не все свойства,а только некоторые.Это связано с тем,что невозможно через COM интерфейс вытянуть полный список атрибутов html объекта.Копируются атрибуты: имя тега,id, класс(className),имя(name),текст.Метод работает достаточно медленно,потому что требуется очень много удаленных вызовов к COM объектам.Предназначен для отладочных целей.

bool sendOuterHTMLForFrame();

Метод обрабатывает команду 11. Java клиенту отправляется  html код,найденный во фрейме с заданными параметрами.В методе осуществляется получение параметров для поиска от java клиента,вызов метода findFrameByParameters для поиска фрейма и получение html кода из фрейма,который и возвращается java клиенту.

bool sendXmlDomModelForFrame();

Метод обрабатывает команду 12. Работает аналогично предыдущему методу, но в методе производится вызов локально объявленной функции getXmlDom, которая рекурсивно формирует копию DOM  модели.

bool sendDocumentTitle(sockaddr* sendTo,int addrlen);

Метод обрабатывает команду 1. Возвращает заголовок текущего открытого документа.

bool sendDocumentStatus(sockaddr* sendTo,int addrlen);

Метод обрабатывает команду 15. Возвращает содержание строки –статуса текущего документа.

bool loadUrl();

Метод обрабатывает команду 16. Загружает в браузер страницу,адрес которой предан java программой в параметрах.

bool sendNonHtmlDialogText(sockaddr* sendTo,int addrlen);

Метод обрабатывает команду 3. Производит поиск по имени заголовка окна windows ,если окно найдено,передает в java программу текст,содержащийся в найденном окне.

bool clickByElementId(SOCKET socket,SOCKADDR * recvAddress,int length);

Производит поиск html объекта по значению параметра id.Параметр передается java клиентом.Далее производится генерация события “onmouseclick” вызовом метода html объекта click.Данный метод был заменен методом clickByElementByPath.

bool clickByElementWithParameters();

Метод обрабатывает команду 4. Производит поиск html объекта по набору параметров .Параметр передается java клиентом.Далее производится генерация события “onmouseclick” вызовом метода html объекта click.Данный метод был заменен методом clickByElementByPath.  Поиск осуществляется с помощью метода findElementByParameters.

 

bool clickByElementByPath();

Метод обрабатывает команду 5. Производит поиск html объекта по строке,переданной  java клиентом.Синтаксис строки поиска приведен в описании сетевого протокола.Для поиска используется метод findElementByPath. Далее производится генерация события “onmouseclick” вызовом метода html объекта click

bool fireMouseOverByPath();

Метод обрабатывает команду 20. Поиск html объектов  производится аналогично  clickByElementByPath. Для найденного html объекта производится генерация события “onmouseover” .

bool setValueToElementNewThread();

Метод обрабатывает  команду 13. Поиск  производится аналогично clickByElementByPath() в текущем потоке, а генерация события производится в новом потоке.Запускаемый поток является функцией ClickThread.

bool clickByElementByPathNewThread();

Метод обрабатывает  команду 14. Поиск  производится аналогично clickByElementByPath() в текущем потоке, а генерация события производится в новом потоке.Запускаемый поток является функцией EditorThread.

bool clickByButtonDialogWindow();

В методе выполняется команда 10.Метод производит поиск окна windows с заданным заголовком и поиск в этом окне подокна(кнопки) с заданным текстом.Если найти нужное окно нужную кнопку удается ,то кнопке посылаются сообщения :

(WM_NCMOUSEHOVER,MK_LBUTTON,3) , (WM_LBUTTONDOWN,MK_LBUTTON,3), (WM_LBUTTONUP,MK_LBUTTON,3) , (WM_NCMOUSEHOVER,MK_LBUTTON,3 ) ,( WM_LBUTTONDOWN,MK_LBUTTON,3) ,( WM_LBUTTONUP,MK_LBUTTON,3).

bool setValueToElementByPath();

Метод выполняет команду 7. Поиск html  объекта,как в  методе clickByElementByPath() . У найденного  html объекта  вызывается интерфейс IHTMLInputElement  ,в случае неудачи  IHTMLSelectElement .Если получить интерфесй для редактирования значения не удалось, то установка значения невозможно,и java программе возвращается результат обработки –ошибка.Если получить интерфейс удалось,то объекту присваивается новое значение.

bool getValueFromElementByPath();

Метод выполняет команду 8. Поиск html  объекта,как в  методе clickByElementByPath().У найденного  html объекта  вызывается интерфейс IHTMLInputElement  ,в случае неудачи  IHTMLSelectElement .Если получить интерфесй для редактирования значения не удалось,то java программе возвращается ошибка,в противном случае –значение  атрибута value  html объекта.

bool isFinished();

Метод  возвращает,была ли завершена работа класса NetworkController(и процесса обработки команд java части).

void doClickThread();

Работает аналогично методу clickByElementByPath , однако в начале работы метода обновляется ссылка на web браузер.Метод вызывается из функции ClickThread.

void doEditorThread();

Работает аналогично методу setValueToElementByPath, однако в начале работы  метода обновляется ссылка на браузер.Метод вызывается из функции EditorThread.

void logEvent(IDispatch* _pEvtObj);

Метод используется для логирования действий пользователя.Логирование производится, если  java программа отправляла команду 17. Действия сохраняются  в xml документы,которые хрянятся в  свойстве объекта actions типа std::vector.

void logDocumentComplete(VARIANT *pvarURL);

Метод вызывается  после полной загрузки документа в браузер.Если ранее была получена команда 17, событие сохраняется в виде объекта XML в массиве actions.

bool startRecord();

Метод для обработки команды 17. Метод изменяет локальную переменную needRecord на true,  на основании проверок значения этой переменной определяется,нужно ли логировать действия пользователя и загрузки страниц.

bool sendLogs();

Метод для обработки команды 18. Протокол отправки логов описан выше.После отправки java клиенту логи удаляются(то есть объект vector очищается),чтобы избежать повторной отправки.

bool closeBrowser();

Метод для обработки команды 19.Вызывает функцию quit браузера для завершения его работы.

void performRequests();

Метод,в котором определяется по номеру команды, в каком методе нужно команду обрабатывать.

bool sendPacket(sockaddr* sendTo,int addrlen,TCHAR* packetBuffer,long packetLength);

Отправка сообщения java клиенту.Параметры:

1.sendTo,addrlen  адрес получателя.

packetBuffer – последовательность символов unicode в кодировке UTF16le

packetLength – длина массива.

bool recvExtraPackets(SOCKET socket,SOCKADDR * recvAddress,int length,TCHAR** recvBuffer);

Получение от java клиента  параметра.

socket – прослушиваемый socket ,

recvAddress, length  -адрес java клиента.

recvBuffer –переменная,в которой будет сохранен  адрес полученного массива символов юникод.

void getElementWithParameters(IHTMLDocument3* doc,CComQIPtr<IHTMLElement>* htmlElement, TCHAR* request);

Осуществляет поиск html объекта в заданном документе по заданному набору параметров.

Параметры:

doc – документ,в котором производится поиск
htmlElement –переменная,в которой будет возвращен результат поиска
request –массив символов юникод,содержащий поисковый запрос.

Синтаксис поискового запроса такой же,как и для команды 5. Если не найдено ничего,будет возвращен NULL.Если несколько html объектов соответствует параметрам запроса,будет возвращен первый найденный.

 

void getRootAbsoluteChild(IHTMLDocument3* doc,CComQIPtr<IHTMLElement>* htmlElement, std::wstring* stepRequest);

Возвращает ссылку на объект body текущего html документа.

doc –ссылка на текущий документ

htmlElement –возвращаемое значение

stepRequest- поисковый запрос,не используется.

void getRelativeChild(IHTMLElement* parent,CComQIPtr<IHTMLElement>* htmlElement, std::wstring* stepRequest);

Осуществляется поиск  дочернего html объекта  для заданного родительского html  объекта с заданными параметрами.

Передаваемые праметры:

parent –родительский html объект;

htmlElement –переменная,в которую будет возвращен результат поиска.

stepRequest –запрос для заданного шага поиска.

Имеет формат

All|Children<параметры поиска> .

All – искать среди всех дочерних объектов.

Children-искать среди объектов,непосредственно являющихся дочерними.

Если не найдено ничего,будет возвращен NULL.Если несколько html объектов соответствует параметрам запроса,будет возвращен первый найденный.

 

void getElementByPath(IHTMLDocument3* doc,CComQIPtr<IHTMLElement>* htmlElement, TCHAR* request);

Осуществляет поиск html объекту  в заданном документе по заданному выражению пути к объекту.Параметры:

doc – документ,в котором производится поиск

htmlElement –переменная,в которую будет возвращен результат поиска

request –строка,содержащая поисковый запрос.Синтаксис –как для команды 6.

Если ничего найти не удалось  ,результат – NULL. В противном случае будет возвращен первый найденный объект.

void findFrameByParameters(IHTMLDocument2* parentDoc, CComQIPtr<IHTMLDocument2>*docResult,TCHAR* parameters);

Производит поиск фрейма с заданным набором параметров.Параметры:

parentDoc –родительский документ;

docResult – В эту переменную будет возвращен результат поиска .документ,содержащийся в  найденном фрейме,или NULL,если ничего не найдено;

parameters – параметры поиска.(формат,как для команды 5).

bool isMasked(TCHAR* keyword);

Проверяет,экранировано ли символ  символом “/”.Если перед символом идет четное количество символов “/”,ключевой символ не экранирован,в противном случае он экранирован. На вход подается  указатель на проверяемый ключевой символ.

std::map<std::wstring,TCHAR*>* buildParameterMap(TCHAR* parameters);

Метод производит разбор строки параметров и построение объекта map,в котором ключем являются названия параметров,а значениями – требуемые значения этих параметров.

Синтаксис подаваемой на вход строки символов:<параметр1>=<значение1>[&&<параметр2>=<значение2> и т.д.].

std::vector<std::wstring>* splitPath(TCHAR* path);

Разбивает строку,в которой указан путь к html объекту на отдельные подзапросы,состоящие из символа “<”,строки с запросом, и символа “>”.На вход подается строка с запросом из команды 6.

void getElementFromParentWithparameters(IHTMLElement* parent,CComQIPtr<IHTMLElement>* htmlElement, TCHAR* parameters);

Ищет html объект с заданным набором парметров,который является дочерним объектом для заданного html объекта или его дочерних объектов.Параметры:

parent – родительский html объект;

htmlElement –найденный html объект,если найти удалось,иначе NULL;

parameters –парметры для поиска.

void getElementFromParentWithParametersRelative(IHTMLElement* parent,CComQIPtr<IHTMLElement>* htmlElement, TCHAR* parameters);

Поиск html объекта среди html объектов,непосредственно являющихся дочерними для заданного html объекта.Параметры.

parent – родительский html объект;

htmlElement –найденный html объект,если найти удалось,иначе NULL;

parameters –парметры для поиска.

 

void clearMask(std::wstring* source );

Удаление из строки запроса  символов “/”.Сдвоенные символы заменяются ординарным.

void findElementWIthParameters(IHTMLElementCollection* collection,CComQIPtr<IHTMLElement>* htmlElement,std::map<std::wstring,TCHAR*>* parameters);

Поиск html объекта в коллекции по набору параметров.Парметры,передаемые в метод:

collection –коллекция html объектов

htmlElement –указатель на переменную,в которую будет сохранен результат поиска

parameters – параметры,по которым  производится поиск html объекта.

bool isMasked(std::wstring* source,int pointerIndex);

Метод проверяет,было ли экранирован служебный символ символом “/”.Принцип работы такой же,как и для перегруженного метода, только   указателем на символ является комбинация из объекта –строки и  номера символа.

bool sendCurrentURL();

Метод отправляет java части URL документа,загруженного в браузер.

Функции, объявленные в файле NetworkController.h

DWORD WINAPI MyThread( LPVOID lpParam );

Функция,в которой запускается метод startListen  класса NetworkController.Функция выполняется в отдельном потоке.

DWORD WINAPI ClickThread(LPVOID lpParam);

Функция,в которой вызвается метод doClickThread() .Выполняется  в отдельном потоке.

DWORD WINAPI EditorThread(LPVOID lpParam);

Функция,в которой вызывается метод doEditorThread(). Выполняется в отдельном потоке.

Функции,объявленные в файле NetworkController.cpp

void getXmlDom(CComPtr<IHTMLElement> htmlElement,CComPtr<IXMLDOMElement>* result )

Рекурсивная функция,формирующая XML с копией DOM модели IE.

void Util_AddTextToBuffer(const TCHAR *szText, TCHAR *szBuffer, unsigned int iBufSize)

Добавляет текст,переданный в переменной szText в строку,передаваемую в параметре szBuffer.Переменная iBufferSize содержит длину строки –принимающего буфера.

BOOL CALLBACK Util_clickByButton(HWND hWnd, LPARAM lParam)

CALLBACK функция,используемая для обхода всех окон с заданным заговоловком и генерации “клика” на кнопке с заданным текстом.

BOOL CALLBACK Util_GetWinTextProc(HWND hWnd, LPARAM lParam)

CALLBACK функция,используемая для обхода всех окон с заданным заголовком и сбора текста,который в этом окне хранится.

Локальные переменные класса NetworkController.

SOCKET ListenSocket;-хранит прослушиваемый сокет.

sockaddr_in senderAddress;-адрес отправителя(java программы)

int length;-длина адреса отправителя

bool finished;-была ли завершена работа класса.

bool hasSetBrowser;-был ли установлен браузер

bool hasUpdateBrowser;-был ли обновлен бразуер

bool needRecord;-нужно ли логировать действия пользователя

std::vector<CComPtr<IXMLDOMDocument>> * actions;-список XML документов с логами действий пользователя

LPVOID browserVoid;-ссылка на стрим со ссылкой на браузер

CComQIPtr<IWebBrowser2> browser; - указатель на COM объект браузера

fd_set set; -список  сокетов,над которыми производятся сетевые операции.