处理IE窗口内的ActiveX组件

时间:2011-07-28 23:59:11

标签: c internet-explorer activex

我有一项任务,包括使用“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

}

2 个答案:

答案 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方法的示例。