COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)

声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。

最近遇到两个需求:1)在ActiveX控件中使用工作线程来完成底层的硬件设备扫描任务,并在工作线程中根据操作结果回调外部web页面的JavaScript函数;2)能根据控件任务的不同自动调整控件大小。但在查阅了大量资料后,发现网上讨论ActiveX中多线程开发的文章基本没有,最后在csdn论坛里遇到一个高手帮忙后,摸索了几天才解决这两个问题,本文的目的就在于记录下我解决这两个问题的过程,也希望能帮助到以后有同样需求的朋友。

简单抽象下第一个任务的模型:在AcitveX控件中开启一个工作线程去执行特点任务后,然后根据工作线程的执行结果中去通知外部的web页面的JavaScript。在进入到多线程之前,先来介绍下ActiveX中调用外部web页面的JavaScript函数的两种方式。

ActiveX中调用JavaScript

第一种方式是使用事件,这是最简单方法。在“类视图”中,右键CMyActiveXCtrl ,选择“添加事件”,这种方式就不赘述了。

第二种方式是利用IWebBrowser2和IHTMLDocument2这两个COM组件来访问包含ActiveX控件的外部Web页面上的所有元素。具体实现步骤如下:

1, 在CMyActiveXCtrl类中加入两个变量:

public:
  IWebBrowser2* pWebBrowser; //IE浏览器
  IHTMLDocument2* pHTMLDocument; //包含此控件的web页面

2,重载OnSetClientSite函数。

void CMyActiveXCtrl::OnSetClientSite()
{
  HRESULT hr = S_OK;
  IServiceProvider *isp,*isp2 = NULL;
  if (!m_pClientSite)
  {
    COMRELEASE(pWebBrowser);
  }
  else
  {
    hr = m_pClientSite->QueryInterface(IID_IServiceProvider,reinterpret_cast<void **>(&isp));
    if (FAILED(hr))
    {
      hr = S_OK;
      goto cleanup;
    }
    hr = isp->QueryService(SID_STopLevelBrowser,IID_IServiceProvider,reinterpret_cast<void **>(&isp2));
    if (FAILED(hr))
    {
      hr = S_OK;
      goto cleanup;
    }
    hr = isp2->QueryService(SID_SWebBrowserApp,IID_IWebBrowser2,reinterpret_cast<void **>(&pWebBrowser)); //查询IE浏览器接口
    if (FAILED(hr))
    {
      hr = S_OK;
      goto cleanup;
    }
    hr  =  pWebBrowser->get_Document((IDispatch**)&pHTMLDocument); //查询Web页面接口
    if(FAILED(hr))
    {
      hr = S_OK;
      goto cleanup;
    }
  cleanup:
    // Free resources.
    COMRELEASE(isp);
    COMRELEASE(isp2);
  }
}

时间: 2024-08-30 17:55:07

COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)的相关文章

COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)

声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open License (CPOL). 在上一篇文章<COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)>中介绍了ActiveX控件中使用多线程的基本需求,并提出了一个简单的线程模型,但却出现了意想不到的问题,本文将尝试给出问题的一个可行的解法,并同时解决上文中提出

COM组件开发实践(一)

开发实践(一)-前端组件化开发实践"> Preface 因为项目需要,开始从事ActiveX方面的工作,看了一些资料,可惜都是些COM原理方面的,没有切合实际动手的东西,在CodeProject上读完David Marcionek的文章[1]后,收获良多,但也遇到一些恼人的小问题,因此在其基础上就一些易错点做些小注解.本文版权归David Marcionek所有. 简介 在本文中,我们将创建一个ActiveX控件,当加载控件时,它会显示一个动画进度条,以便向用户表明控件正在加载.此控件会包

COM组件开发实践(六)---From C++ to COM :Part 3

在上一篇文章<COM组件开发实践(五)---From C++ to COM :Part 2 >中,我们进展到使用COM库加载C++对象了,这一篇中我们将真正将C++对象变成 COM对象,而在下一篇中我们将为它添加多接口支持. C++对象变成COM对象 要将一个C++对象变成一个真正的COM对象,只需要如下操作: 1)实现接口的引用计数.因此每个COM对象都需要有两个函数用于管理引用计数: ULONG AddRef(); ULONG Release(); 这两个函数不返回HRESULT,因为它们

COM组件开发实践(五)---From C++ to COM :Part 2

一,使用抽象基类重用C++对象 在上一篇文章<COM组件开发实践(四)---From C++ to COM :Part 1>中,我们已经将要复用的C++对象封装到DLL中了,对象的声明和实现已经实现了剥离,但还有问题:对象的私有成员(如我们示例中CDB类的数组变量m_arrTables)还是被客户看得一清二楚,即使客户没办法去访问它们:若对象改变了它的数据成员的大小,则所有的客户程序必须重新编译. 而实际上,客户需要的仅仅是对象的成员函数的地址,因此使用抽象基类可以很好地满足以上需求,客户就不

COM组件开发实践(三)

前面两篇文章分别介绍了MFC ActiveX应用程序和使用ATL开发ActiveX的简单实例,但还有两个问题需要解决: 1)标记ActiveX控件为安全的控件 2)对控件进行数字签名.本文将结合这两点进行简单的介绍. Building a Safe ActiveX Control 如何不想办法将控件标记为安全的,就会在Web页面与控件进行交互时出现如下图的警告信息: 下面将分别介绍在MFC ActiveX和ATL中如何标记一个控件为安全的控件. 要标记一个MFC ActiveX控件为安全,可以仿

COM组件开发实践(四)---From C++ to COM :Part 1

一,C++客户重用C++对象 假设已经有一个可以重用的类,我们就可以在自己的程序中去重用它,只需要将其定义和实现文件加入到我们自己的工程中,并且在使用它的文件中包含此类的定义文件就可以了,这也是我们最常用的C++标准重用方法.就拿我自己来说,在CodeProject上遇到比较好的控件代码,都是这样直接用到自己的项目中来的. 下面就给出我这个系列的第一个代码示例,在接下来的几篇文章中,将基于此代码不断进行改进,一步步从C++走向COM. 简单介绍下我们要重用的C++对象,它是一个简单的类似数据库的

COM组件开发实践(二)

假设需求如下:底层是一个数学运算库DLL,中间是ActiveX控件(它调用底层的数学运算库DLL来完成控制层),界面层在测试时可以是一个exe程序,最后发布到IE浏览器上测试. 数学运算库DLL的开发 新建一个Win32 DLL项目,加入一个头文件MyNum.h,在其中声明所有的数学函数(为简单起见,本文只考虑加法运算),代码如下: #ifndef MY_NUM_H #define MY_NUM_H int __stdcall AddNum(int,int); #endif 请注意这里的方法声明

8天玩转并行开发——第七天 简要分析任务与线程池

原文:8天玩转并行开发--第七天 简要分析任务与线程池          其实说到上一篇,我们要说的task的知识也说的差不多了,这一篇我们开始站在理论上了解下"线程池"和"任务"之间的关系,不管是 说线程还是任务,我们都不可避免的要讨论下线程池,然而在.net 4.0以后,线程池引擎考虑了未来的扩展性,已经充分利用多核微处理器 架构,只要在可能的情况下,我们应该尽量使用task,而不是线程池.   首先看一下task的结构 从图中我们可以看出Task.Factor

控件开发和组件开发有什么区别?

问题描述 RT好像很多地方都说差不多可是VS2005中为什么添加的时候有服务器控件还有组件选项?如果不一样,哪个简单,是控件开发简单吗?请回答的尽量详细,谢谢! 解决方案 解决方案二:我们所说的控件一般是指按钮文本框图表控件等等组件是一个更广泛的概念,其可以包含可视化的控件,也包含不可视的后台服务.组件就是一个独立的执行单位,其一般通过接口方法被调用,实现高内聚,松耦合解决方案三:想问下<庖丁解牛>这本书说说的组件/控件,目录里写的又都是控件,那这本书里的是都是组件和控件,还是什么?解决方案四