Activex宿主和寄宿者之间的运用

2024-03-14 22:48

本文主要是介绍Activex宿主和寄宿者之间的运用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       宿主和寄宿者之间只是为了方便理解的一个称谓,而实际上是没有这种说法的。

      Acitvex控件浏览文件,诸如Excel,Flash,html 都需要实现所谓的客户端和服务端程序组件,加以控制最后显示给用户 IOleObject作为服务控件的一个借口提供了设置客户端接口的一个方法SetClientSite,只要实现IOleClientSite ,通过实例化IOleClientSite(关键字:NEW)接口【IOleInPlaceSite】。其中IOleCLientSite构造函数中需要一个容纳activex控件的窗口句柄。

 

      调用如下:

        HRESULT hr;
CLSID cls;
IOleObject * pObject = NULL;
CControlContainer * pContainer = NULL;
hr = CLSIDFromProgID(ProgId,&cls);
if (FAILED(hr)) goto exit1;

hr=CoCreateInstance(cls,NULL,CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER,IID_IOleObject,(void**)&pObject);//创建一个acitvex控件
if (FAILED(hr)) goto exit1;


pContainer = new CControlContainer(hWnd);//实例化宿主客户端
hr = pObject->SetClientSite(pContainer);//activex控件宿主
if (FAILED(hr)) goto exit1;
hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0);//激活控件 指定控件的父窗体
if (FAILED(hr)) goto exit1;


    pObject->QueryInterface(IID_IUnknown,(void**)ppControlUnknown);//取得activex控件的IUnknown 指针 
pContainer->QueryInterface(IID_IUnknown,(void**)ppContainerUnknown);//取得宿主的指针
hr = S_OK;
exit1:
if (pObject) pObject->Release();
if (pContainer) pContainer->Release();
return hr;

      

     显示Flash影片:

       注意:hr = CLSIDFromProgID(”ShockwaveFlash.ShockwaveFlash.11“,&cls);的ProgID,在注册表中可以找到

        IDispatch * pDisp = NULL;
HRESULT hr;
DISPID propId;
const wchar_t * ppNames[] = {prop};
DISPPARAMS dispparams;
DISPID paramDispId;
hr = pUnk->QueryInterface(IID_IDispatch,(void**)&pDisp);
if (FAILED(hr)) return hr;
//Query prop id
hr = pDisp->GetIDsOfNames(IID_NULL,(LPOLESTR*)ppNames,1,LANG_SYSTEM_DEFAULT,&propId);
if (FAILED(hr)) goto exit1;
//call
paramDispId = DISPID_PROPERTYPUT;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs =&paramDispId;
dispparams.rgvarg = pVal;
hr = pDisp->Invoke(propId,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT,&dispparams,NULL,NULL,NULL);
exit1:
if (pDisp) pDisp->Release();
return hr;

   

       另窗体主写的话,需要在Main函数的WM_CREATE中添加以下代码:

       IUnknown * pControl;
IUnknown * pContainer;
HRESULT hr = CreateAxControl(hWnd,L"ShockwaveFlash.ShockwaveFlash.11",&pControl,&pContainer);

   

      

    

    

 

这篇关于Activex宿主和寄宿者之间的运用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809959

相关文章

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一