我有一项任务,包括使用“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-从IHTMLElementCollection获取IDispatch,其元素名称为“S_DetectCom”
要记住的是从DLL获取类型库以了解方法,...及其参数 通过尝试和错误找到cab中的哪个dll嵌入到该网页
现在我卡住了,因为我不知道怎么到ID调用来调用来自IDispatch的方法
我很感激,如果有人可以帮助我提出想法和实现,下面是从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
}
答案 0 :(得分:0)
如果您使用WM_HTML_GETOBJECT来获取HTML文档,那么您肯定不是预期的调用者,因为您已超出当前线程。 ActiveX可能不是线程安全的。
无论如何,如果你可以在IE的Tab线程中执行代理插件(可能是通过安装BHO),here are the steps来访问ActiveX的属性和方法。它用于访问Adobe Flash ActiveX,但您可以在import语句中更改文件名以从ocx文件导入接口。
答案 1 :(得分:0)
如果我是你,而不是直接尝试使用COM,我会编写一个FireBreath插件,然后可以在firefox等IE上运行(它实现了一个ActiveX控件以及一个NPAPI插件)。
这将为您完成所有IDispatch的工作,然后您可以绑定到较低级别的类(查看IDispatchAPI)以获取该元素的直接COM句柄,并获取该接口的查询接口需要。
如果没有别的,您可以使用IDispatchAPI类作为如何访问IDispatch方法的示例。