Обработка компонента ActiveX в окне IE - PullRequest
0 голосов
/ 29 июля 2011

У меня есть задача, которая включает в себя захват некоторого текста, который находится внутри стороннего компонента ActiveX, встроенного в веб-страницу Internet Explorer, с использованием «OBJECT id = S_DetectCom codeBase = xxxx.cab ...»

У меня есть файл .cab с dll ActiveX (4 dll)

Я не знаком с OLE и ActiveX, но проводя некоторые исследования и испытания, я мог бы получить IDispatch для объекта ActiveX, выполнив следующие шаги: -

1 - получить указатель на вкладку IE с классом "Internet Explorer_Server"

2 - получить IHTMLDocument2, используя ObjectFromLresult

3 - получить IHTMLElementCollection из IHTMLDocument2

4 - получить IDispatch из коллекции IHTMLElementCollection с элементом имени "S_DetectCom"

что нам нужно, это получить библиотеку типов из библиотек DLL, чтобы узнать методы ... и их параметры методом проб и ошибок найдите, какая dll в кабине встроена в эту веб-страницу

сейчас я застрял, так как не знаю, как связаться с Invoke для вызова методов из IDispatch, который я получил

Буду признателен, если кто-нибудь поможет мне с идеями и реализацией ниже, это часть кода, которая получает IDispatch от hwnd

int msg;
DWORD lRes = NULL ;
IHTMLDocument2 *pDoc= NULL; 
IHTMLElementCollection *pElement = NULL ;
IHTMLInputTextElement *ppvInput ;
IDispatch *ppvDisp;
ITypeInfo *TypeInfo = NULL ;
VARIANT ObjName ;
_variant_t index = NULL;
HRESULT hr;
LRESULT lr ;
UINT cntTypeInf= NULL ;
long pItems = NULL;
BSTR pszOptText[200];


OleInitialize(NULL);

msg = RegisterWindowMessage(L"WM_HTML_GETOBJECT");
lr = SendMessageTimeout(hwnd, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes);
hr = ObjectFromLresult((LRESULT)lRes, IID_IHTMLDocument2, 0, (void**)&pDoc);
hr = pDoc->get_all( &pElement );

BSTR BStrObjName = _com_util::ConvertStringToBSTR((const char *)"S_DetectCom");
ObjName.vt = VT_BSTR ;
ObjName.bstrVal = BStrObjName ;
hr = pElement->item( ObjName , index , &ppvDisp );
if (hr == S_OK && ppvDisp)
{
    hr = ppvDisp->GetTypeInfoCount(&cntTypeInf);
    hr = ppvDisp->GetTypeInfo(NULL , NULL , &TypeInfo);
    // to do here

}

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Если бы вы не пытались использовать COM напрямую, я бы написал плагин FireBreath , который затем работал бы с Firefox и т. Д., А также с IE (он реализует элемент управления ActiveX, а такжеПлагин NPAPI).

Это сделает все вещи IDispatch за вас, а затем вы можете привязаться к классам более низкого уровня (посмотрите на IDispatchAPI), чтобы получить прямой COM-дескриптор для элемента после того, как вы его захватите исоздайте интерфейс запроса для нужного вам интерфейса.

Если ничего другого, вы можете использовать класс IDispatchAPI в качестве примера доступа к методам IDispatch.

0 голосов
/ 02 августа 2011

Если вы используете WM_HTML_GETOBJECT для получения HTML-документа, вы определенно не являетесь ожидающим абонентом, поскольку вы находитесь вне текущего потока. ActiveX, вероятно, не является потокобезопасным.

В любом случае, если вы можете заставить прокси-плагин выполняться в потоке вкладок IE (возможно, установив BHO), здесь приведены шаги для доступа к свойствам и методам ActiveX. Он предназначен для доступа к Adobe Flash ActiveX, но вы можете изменить имя файла в операторе импорта для импорта интерфейсов из файла ocx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...