У меня есть задача, которая включает в себя захват некоторого текста, который находится внутри стороннего компонента 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
}