2011-07-28 36 views
0

我有一个任务,其中包括抓取一些位于第三方ActiveX组件内部的文本,这些文件使用“OBJECT id = S_DetectCom codeBase = xxxx.cab ...”嵌入到Internet Explorer网页中。处理IE窗口中的ActiveX组件

我有具有.cab文件的ActiveX DLL文件(4 DLL)的

我不熟悉的OLE和ActiveX,但做了一些研究和试验,我可以通过以下步骤获得一个IDispatch到ActiveX对象: -

1-获得具有“Internet Explorer_Server”类的IE选项卡的句柄

2- GET的IHTMLDocument2使用ObjectFromLresult

3-从的IHTMLDocument2

得到IHTMLElementCollection

4-获取IDispatch接口从IHTMLElementCollection用的名字 “S_DetectCom”

元素是什么样的想法,正从类型库DLL知道方法,...和他们的参数 通过尝试和错误发现哪些DLL在驾驶室嵌入到该网页

现在我卡住了,因为我不知道如何达到调用至 从IDispatch接口调用方法,我得到

我会很感激,如果有人能帮助我的想法和执行下面的代码是一部分如果您使用WM_HTML_GETOBJECT得到HTML文件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 

} 

回答

0

得到的IDispatch你绝对不是预期的调用者,因为你不在当前的线程中。该ActiveX可能不是线程安全的。

无论如何,如果你可以得到一个代理插件在IE的Tab线程中执行(可能通过安装一个BHO),here are the steps来访问ActiveX的属性和方法。它用于访问Adobe Flash ActiveX,但可以在导入语句中更改文件名以从ocx文件导入接口。

+0

你可以指定更多,你指的是“期望的调用者”,以及当前线程意味着什么? – motash

+0

大多数ActiveX是为UI线程内的调用设计的STA对象。 –

0

如果我是你而不是尝试直接使用COM,我会写一个FireBreath插件,然后在firefox等工作,以及IE(它实现一个ActiveX控件以及一个NPAPI插件)。

这将为你做所有的IDispatch的东西,然后你可以绑定到较低级别的类(看看IDispatchAPI)获取元素的直接COM句柄,然后你抓住它并为接口做一个查询接口你需要。

如果没有其他人可以使用IDispatchAPI类作为如何访问IDispatch方法的示例。