【发布时间】:2011-08-04 05:54:05
【问题描述】:
我有一个任务,其中包括使用“OBJECT id=S_DetectCom codeBase=xxxx.cab ...”获取嵌入在 Internet Explorer 网页中的第三方 ActiveX 组件中的一些文本
我的 .cab 文件包含 activeX dll(4 个 dll)
我不熟悉 OLE 和 activeX,但是做一些研究和试验,我可以通过以下步骤获得一个 IDispatch 到 ActiveX 对象:-
1- 获取具有“Internet Explorer_Server”类的 IE 选项卡的句柄
2- 使用 ObjectFromLresult 获取 IHTMLDocument2
3- 从 IHTMLDocument2 获取 IHTMLElementCollection
4- 从名为“S_DetectCom”的元素的 IHTMLElementCollection 中获取 IDispatch
要记住的是,从 DLL 中获取类型库以了解方法、...及其参数 通过尝试和错误找到驾驶室中的哪个dll嵌入到该网页中
现在我被卡住了,因为我不知道如何通过 IDispatch 调用 Invoke 方法
如果有人可以帮助我提出想法和实现,我将不胜感激,下面是从 hwnd 获取 IDispatch 的代码部分
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
}
【问题讨论】:
标签: c internet-explorer activex