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

相关文章

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

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、它们之间的相互转化上篇文章给大家介