【问题标题】:Handling ActiveX component inside IE window在 IE 窗口中处理 ActiveX 组件
【发布时间】: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


    【解决方案1】:

    如果您使用 WM_HTML_GETOBJECT 来获取 HTML 文档,那么您肯定不是预期的调用者,因为您已退出当前线程。 ActiveX 可能不是线程安全的。

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

    【讨论】:

    • 能否详细说明,“预期调用者”是什么意思,脱离当前线程意味着什么?
    • 大多数 ActiveX 是为 UI 线程中的调用而设计的 STA 对象。
    【解决方案2】:

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

    这将为您完成所有 IDispatch 工作,然后您可以绑定到较低级别的类(查看 IDispatchAPI),以便在抓取元素后获取该元素的直接 COM 句柄,并为您的接口执行查询接口需要。

    如果不出意外,您可以使用 IDispatchAPI 类作为如何访问 IDispatch 方法的示例。

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多