关键词:
一、IDispatch接口与Variant类型
1.IDispatch的简介与作用
a) 自动化技术让解释下语音能够调用到自定义的接口,
b) 具有自动化功能的组件是支持IDispatch接口的COM组件
c) IDispatch能够接收一个函数的字符串名称,并执行这个函数.
d) 解释性语言要调用COM组件的自定义接口都是通过自动化控制
程序把自定义接口中的函数的字符串和参数传递给IDispatch
而IDispatch间接的执行自定义接口中的函数.
e) 重要的函数 GetIDsOfNames和Invoke
GetIDsOfNames函数将读取一个函数名称,并返回其调用ID,
Invoke函数接收一个调度ID,跟函数参数,执行调用ID所对应函数功能.
f) 所以解释下语音跟宏语音不必直接认识我们的自定义接口,
只要我们的COM组件支持了IDispatch接口,他们就能通过自动化控制
程序调用我们的IDispatch接口,通过传入函数名字的字符串
和函数参数来执行调用我们的自定义接口.
2.常用的COM数据类型
a)基本类型
CHAR typedef char CHAR CHAR* char指针
BYTE 无符号的char BYTE*
SHORT typedef short SHORT SHORT*
USHORT 无符号short USHORT*
INT typedef int INT*
UINT 无符号int UINT*
LONG typedef long LONG*
ULONG 无符号long ULONG*
FLOAT FLOAT*
DOUBLE DOUBLE*
VARIANT_BOOL COM中的布尔类型 typedef short VARIANT_BOOL
注意: 0== FALSE -1== TRUE
VARIANT_BOOL*
b) 字符串
BSTR COM中的字符串类型
BSTR* BSTR指针
BSTR是指向的是宽字符串的指针,是一个带有
字符计数值的字符串,且这个计数值是保存在字符数组的开头
3.BSTR基本操作
a) 错误赋值 BSTR str = L"ABCD";
这样是错误的,因为字符串前面没有计数值
b)BSTR SysAllocString(const OLECHAR*)
是COM申请BSTR字符串的方法,把CHAR* 传进去,返回BSTR类型
c)BSTR SysAllocStringLen(const OLECHAR* ,UINT)
根据字符串指针与字符个数构造BSTR字符串
d)UINT SysStringLen(BSTR)获取字符串计数值
e)void SysFreeString(BSTR)释放字符串,当COM中的
字符串(BSTR)不再使用后,调用该函数.
BSTR strA = SysAllocString(L"Hello"); //申请一个字符串
//申请指定个数字符串,从参数1中取
BSTR strB = SysAllocStringLen(strA,SysStringLen(strA));
SysFreeString(strA);
SysFreeString(strB);
4.COM常用数据类型
IUnknown* COM的最基本的接口指针
IUnknown** 指针的指针
IDispatch* 支持组件自动化的接口
IDispatch** IDispatch*的指针
如果写的组件不想被 解释性的语言 脚本语言
查找接口的话, 可以直接使用IUnknown接口
5.万能数据类型 VARIANT
a) 具备跨语言的特性,同时能存储任何的数据类型
为了实现这个类型的功能,C++中这个类型是一个结构体,
这个结构体,里面又有联合体,联合多种基本数据类型
又有变量类型标志VARTYPE vt.标志他的类型
b) 初始化和清楚
VARIANT var; VariantInit(&var); //此时var.vt == VT_EMPTY控件 //..其他操作 //清除操作 VariantClear(&var);
c) VARIANT的使用
用VARIANT保存LONG类型
VARIANT var; VariantInit(&var); //此时var.vt == VT_EMPTY控件 //..其他操作 //清除操作 //VT_I4 ×××就是VT_I2 var.vt = VT_I4; //赋值 var.lVal = 100; VariantClear(&var);
FLOAT类型 VT_R4 DOUBLE VT_R8
var.fltVal flaot值
VARIANT使用BSTR类型
var.vt = VT_BSTR;
var.bstrVal = SysAllocString(L"HEllo");
VT_BOOL 布尔类型
d) 读取值
//先判断类型 在根据类型读取
if(var.vt == VT_l4)
LONG lValue = var.lVar;
6.COM数据类型的转换
LONG转换成FLOAT
VARIANT var; 初始化
var.vt = VT_I4;
var.lVar = 100;
VariantChangeType(&var,&var,0,VT_R4);
if(var.vt = VT_R4)
LONG fValue = var.fltValue;
清空var
7.VARIANT类型的派生类
a) 在派生类扩展VARIANT类使得他的使用更加方便
#include <atlbase.h>ATL库里面就带有一个派生类CComVariant
他简化了初始化和清楚, 构造函数可以直接传递基本类型或者VARIANT类型
可以用C++的类型,也可以用COM基本类型来构造一个对象
INT a = 10; CComVariant b(a); double c = 100.0100; CComVariant d(c);
b) 赋值 重载了运算符 operator= 根据不同类型分配不同值
也就是说如果你是INT型 直接对象=值 d = 100;
(二)、测试简单对象
一、ATL制作简单对象(Simple Object)
完成即可
1.项目创建完成,添加简单对象(Simple Object)
选择简单对象
输入简称
ProgId
ATLProject.HelloSimpleObject
ProgID是程序员给某个CLSID指定一个程序员易记的名称,
某些计算机语言通过PropID来标记组件 命名规则
<Program>.<Component>.<Version>
程序.组件.版本
双重是支持IDispatch接口的,这样这个接口就会支持一些脚本语言等等。
2.给简单对象添加一个方法,
在类视图选中刚添加的这个(选中接口不是添加的类)然后添加方法
接口方法是固定的HRESULT,所以只能用输入的参数作为返回值.
in代表输入
加一个指针就可以显示out,表示是输出的可作为返回值
retval表示用他做返回值
这个ID表示这个方法 在接口里的ID,直接点击完成即可
3.来到解决方案管理器查看项目ild文件
ATLProjectLib的uuid
组件的UUID他被ATLProjectLib包含,组件又包含了这个 我们自定义的接口
会发现我们的组件(简单对象就是组件)支持我们自定义接口(IHelloSimpleObject)
接口定义上面会看到接口IID,
而且接口里就有一个我们刚创建的方法, 他的ID是1
4.方法的声明和实现
在.h文件里声明了
在.c文件里实现了
5.添加属性
他会自动给这个属性添加 SET和GET方法,
ProPutRef表示为引用参数
添加属性方法ID自增
6.编译生成
除了dll文件还生成了两个代码文件(ATLProject_i.h和 _i.c)
这两个文件里面描述的是组件的相关信息,如接口方法接口iid,组件CLSID
7.组件的CLSID
组件的CLSID和IID一样,都是GUID,
组件的CLSID用于标识组件,每一个组件都有一个与之对应的CLSID
红色就是组件名,上面就是他的CLSID
这个就是你输入的组件名
二、在MFC中测试简单对象
直接创建一个对话框程序
stdafx.h添加 _i.h文件 stdafx.cpp 添加_h.c文件
测试代码
组件这些都被宏定义了,使用更方便
HRESULT hr = E_FAIL; //使用COM组件必须初始化 hr = CoInitialize(NULL); if(SUCCEEDED(hr)) //接口指针对象 IHelloSimpleObject* pHello = NULL; //创建接口指针实例 组件对象 //第一个参数是组件标识 //第二个参数NULL //第三个参数一般用这个CLSCTX_INPROC_SERVER //第四个参数接口标识符 //第五个参数 接口指针 返回 hr = CoCreateInstance(CLSID_HelloSimpleObject,NULL,CLSCTX_INPROC_SERVER, IID_IHelloSimpleObject,(LPVOID*)&pHello); if(SUCCEEDED(hr)) LONG sum = 0; hr = pHello->SumLong(100,100,&sum); //读取描述 BSTR bstrs = SysAllocString(L""); hr = pHello->get_m_desc(&bstrs); SysAllocString(bstrs); bstrs = NULL; //写入 BSTR strb = SysAllocString(L"MFC中测试"); hr = pHello->put_m_desc(strb); SysAllocString(strb); bstrs = NULL; bstrs = SysAllocString(L""); hr = pHello->get_m_desc(&bstrs); SysAllocString(bstrs); bstrs = NULL; //接口不再使用 pHello->Release(); //不再使用com组件对象时 一般放在程序结束 CoUninitialize();
com技术入门
...、IDispatch接口与Variant类型1.IDispatch的简介与作用a)自动化技术让解释下语音能够调用到自定义的接口,b)具有自动化功能的组件是支持IDispatch接口的COM组件c)IDispatch能够接收一个函数的字符串名称,并执行这个函数.d)解释性语言要调... 查看详情
《docker技术入门与实战》读书笔记
更改ubuntu的源debhttp://mirrors.aliyun.com/ubuntu/xenialmainrestricteddebhttp://mirrors.aliyun.com/ubuntu/xenial-updatesmainrestricteddebhttp://mirrors.aliyun.com/ubuntu/xenialuniversedebhttp://mirrors.al 查看详情
kafka快速入门
...//blog.51cto.com/9291927/2497814Kafka快速入门(三)——Kafka核心技术https://blog.51cto.com/9291927/2497820Kafka快速入门(四)——Kafka高级功能https://blog.51cto.com/9291927/2497828 查看详情
kafka快速入门
Kafka快速入门Kafka快速入门(一)——Kafka简介https://blog.51cto.com/9291927/2493953Kafka快速入门(二)——Kafka架构https://blog.51cto.com/9291927/2497814Kafka快速入门(三)——Kafka核心技术https://blog.51cto.com/9291927/2497820Kafka快速入门(四) 查看详情
区块链开发
...、区块链快速入门区块链入门系列博客主要根据《区块链技术指南》(杨宝华)学习而来,同时参考了部分网络博客。《区块链技术指南》https://legacy.gitbook.com/book/yeasy/blockchain_guide/details区块链快速入门(一)——区块链简介http... 查看详情
docker入门
1Docker技术介绍DOCKER是一个基于LXC技术之上构建的container容器引擎,通过内核虚拟化技术(namespace及cgroups)来提供容器的资源隔离与安全保障,KVM是通过硬件实现的虚拟化技术,它是通过系统来实现资源隔离与安全保障,占用系... 查看详情
容器技术dockerk8s10入门实践集群创建
参考https://edu.aliyun.com/lesson_2553_27366#_27366 查看详情
docker技术入门与实战-镜像容器仓库
1.如果出现CannotconnecttotheDockerdaemon.Isthedockerdaemonrunningonthishost?解决办法在控制台输入:>$servicedockerstart即可2.hub.docker.com创建了自己的账号,如何push和pullstep1——找到本地镜像的ID:dockerimagesstep2— 查看详情
《docker技术入门与实战》读书笔记与实践
创建支持SSH的服务的镜像Dockerfile内容FROM ubuntuMAINTAINER from www.mtian.net by mtiannetRUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial main restrict 查看详情
如何快速入门网站数据分析与运营?
...为基于网站分析之上的结论可以指导运营、产品、设计、技术的同事的工作。2、网站分析解决的问题36大数据(http://www.36dsj.com/)即分析出:36大数 查看详情
虚拟化技术入门与实践--庖丁解牛
hypervisor之于操作系统类似于操作系统之于进程。它们为执行提供独立的虚拟硬件平台,而虚拟硬件平台反过来又提供对底层机器的虚拟的完整访问。但并不是所有hypervisor都是一样的,这是件好事,因为Linux就是以灵活性和选择... 查看详情
游戏引擎入门
.../www.zhihu.com/question/314175363/answer/650214605C++C#JS需要用到哪些技术?C/C++.JS.C#:OpenGL/DirectX:图形学:线性代数:学习方面1、编程(C、C++、网页制作,计算机图形学背景等)。2、美术(原型概念设计、色彩、模型等)。3、设计(核心... 查看详情
模块化开发---seajs入门学习
SeaJS是一个基于CMD模块定义规范实现一个模块系统加载器 [CMD规范](https://github.com/cmdjs/specification/blob/master/draft/module.md)9、seaJs启动函数的回调函数官网:http://seajs.org/docs/github:https://github.com/seajs/seajs如何选择一个技术产品栈 查看详情
kubernetes学习之入门篇
本篇内容是在公司做技术分享时的PPT,主要内容:Kubernetes&Docker简介容器技术基础知识介绍Kubernetes核心设计浅析详细内容请看PPT:https://download.csdn.net/download/u010657094/13078830或者:https://github.com/ByrsH/doc/blo 查看详情
区块链开发入门到精通
...式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。区块 查看详情
android--dagger2入门
参考技术Adagger拥有两种方式注入对象,一种是利用@Inject注解构造函数在moudle的gradle中做如下配置,我在2.30.1版本中尝试使用构造函数注入,发现怎么编译都会报错,结果最后使用最新版本就可以了:这边定义两个类,分别代表... 查看详情
php技术栈
本文旨在给要学习PHP的新手一个大概的认知轮廓,在心里有个学习的结构,有的放矢,避免走太多弯路。大神请忽略。入门阶段预备知识1、掌握基本HTML、JS、CSS语法;熟悉Bootstrap。参考:https://www.runoob.com/html/html-tutorial.htmlhttps:/... 查看详情
高效入门ebpf
...PF。首先会对BPF和eBPF做简单介绍。接着,介绍使用eBPF技术的前端BCC和bpftrace。然后,以一个初学者的身份介绍如何快速入门BPF。因为BPF 查看详情