COM本质论学习笔记(一)IDL
IDL是Interface Definition Language的所写,翻译为接口定义语言。
1.该语言规定,必须显式的为每个接口函数指定参数的目的,例如
HRESULT foo([in]long* Input, [out]long* Output, [in, out]long* InAndOut);
2.通常,函数的返回值为HRESULT,表示执行的状况,以便被其他语言所捕获,例如Visual Basic等。HRESULT大体分为三个部分:
31|30 29|28 ... 16|15 ...0
成 | 保留 | 操作码 | 信息码
功
或
失
败
第31位如果是0那么代表成功,否则代表失败,这也是Win32 SDK的SUCCESSED宏判断的依据:
#define SUCCESSED(hr) (long(hr) >= 0)
#define FAILD(hr) (long(hr) < 0)
3.该返回值只提供了函数的执行情况,函数可以另外提供返回值:
HRESULT foo([in]long* Input, [out]long* Output, [out, retval]long* InAndOut);
该函数在VB里看起来应该是这样的(凭记忆,未验证):
Public Declare Function foo(ByVal Input as Integer, ByRef Output as Integer) as Integer
如果在VB中调用该函数失败了,那么不是通过返回值把错误码返回,而是VB的解释器触发一个异常,你需要在VB里用On Error xxxx来进行错误处理。
4.声明一个接口。接口的声明是如下形式滴~
[object, uuid(00000000-0000-0000-0000-000000000000)]
interface IMyInterface : IBaseInterface
{
enum MyEnum
{
ME_aa,
ME_bb,
}
typedef struct _ASTRUCT
{
MyEnum me;
long val;
}
HRESULT foo1([in]LONG* Input, [out, retval]RetVal);
}
[]中的部分是接口属性,其中object代表这是一个com接口,后面的部分是全局唯一标识符(GUID),当用在com接口时,也叫做接口标识符(IID)。
接下来IMyInterface是接口名,IBaseInterface是基接口名
{}中则是接口体。
5.细说GUID\IID\CLSID
GUID是个128位的大数,所以COM用一个结构体来表示GUID
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
}GUID;
你看 (4+2+2+8)*8=128.
同时,还有如下定义:
typedef GUID IID;
typedef GUID CLSID;
所以说,IID,CLSID和GUID都是一种东东。
有时为了判断2个GUID是否相等,那么用引用就会很高效,所以还有如下宏定义,以及== 和 !=操作符:
#define REFGUID const GUID&
#define REFIID const IID&
#define REFCLSID const CLSID&
这个GUID/IID通常用VCSDK附带的GUIDGEN.EXE来生成,理论上不会重复~
6.结构体与联合体
在IDL中也可以声明结构体和联合体
typedef struct _TestStruct
{
long a;
short b;
}TESTSTRUCT;
struct TESTSTRUCT2
{
long a;
short b;
};
union VALUE
{
[case(1)]long a;
[case(2)]short b;
};
也可以在结构体或者函数中使用联合:
struct TESTSTRUCT3
{
short t;
[switch_is(t)]union VALUE
{
[case(1)]long a;
[case(2)]short b;
};
};
HRESULT foo1([in, switch_is(t)]union VALUE* pu, [in]short t);
7.属性
给接口添加属性,可以使用户感觉更良好:
[object, uuid(...)]
interface IPropertyInterface : IUnknown
{
// 只读
[propget] HRESULT Age([out, retval]long* RetVal);
// 读写
[propput] HRESULT ID([in]long id);
[propget] HRESULT ID([out, retval]long* id);
}
实现这样的接口也比较容易,只需要在C++类对应的方法前加get_或者put_即可
class CPropertyInterface : public IPropertyInterface
{
public:
....
HRESULT get_Age(long* RetVal);
HRESULT get_ID(long* RetVal);
HRESULT put_ID(long id);
}
转载于:https://www.cnblogs.com/yoran/archive/2008/03/11/1099601.html
COM本质论学习笔记(一)IDL相关推荐
- [学习][笔记]C++/WinRT入门 01Hello world
微软 C++/WinRT简介 windows RT开发笔记:WinRT DLL及其调用研究 How to access the Windows 10 APIs from C++ sample C++/ ...
- 初级Java学习笔记总结
java高并发解决方案: 1.页面静态:静态访问消耗的资源少 信息录入然后生成静态页面以供访问 2.数据库集群和库表散列 主-从数据库关 ...
- 【沃顿商学院学习笔记】商业基础——Operation Management:02运营管理活动中的详细流程分析
运营管理的学习笔记--流程分析 对于流量分析,我们一般会从四个角度来分析问题:流动单元Flow Unit.流动率/吞吐量Flow Rate/Throughput.流动时间Flow Time和库存Inv ...
- 《Metasploit渗透测试魔鬼训练营》学习笔记
Metasploit渗透测试魔鬼训练营学习笔记 法律常识 <中华人民共和国网络安全法>已由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议于2016年11月7日通过,现予公布 ...
- 【转载】Deep Learning(深度学习)学习笔记整理系列
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-0 ...
- 大三Java SE基础学习笔记
Java及Java SE学习笔记 前言 主要用于记录学习过程中的一些笔记. 了解 JavaEE是指Java Enterprise Edition,Java企业版,多用于企业级开发,包括web开发等等, ...
- go kratos 学习笔记(三)
kratos 学习笔记(三) 框架组件 1. API 定义 API 与用户的通信协议,通常是 REST API 和 RPC API 作为传输层协议,而 Kratos 主要参考 Google API 指 ...
- Go爬虫学习笔记(三)
day3 04|敏捷之道:大型Go项目的开发流程是怎样的? 瀑布模式 流程: 市场调研 需求分析 产品设计 研发实现 集成与测试 项目交付与维护 适用场景: 需求在规划和设计阶段就已经确定了,而且 ...
- 分布式系统服务注册与发现原理 SpringCloud 学习笔记
分布式系统服务注册与发现原理 & SpringCloud 学习笔记 分布式系统服务注册与发现原理 引入服务注册与发现组件的原因 单体架构 应用与数据分离 集群部署 微服务架构 架构演进总结 服 ...
最新文章
- EXCEL打开CSV文件乱码的解决方法
- linux下带.d的文件夹,linux – 如何在shell脚本中包含目录中的所有文件(在本例中为/etc/init.d/iptables)...
- python怎样打开加密的文件_如何用Python 加密文件
- LeetCode 861. 翻转矩阵后的得分(贪心)
- PostgreSQL 聚合、分组、排序
- 滚轮y坐标html,web交互之js事件
- java读取某个文件夹下的所有文件
- 圈圈教你玩usb第一版件软件使用说明
- 网件rax40可以刷梅林_深度爆料网件RAX40评价如何?怎么样呢?真实体验曝光
- Android开发指南-窗口小部件(App Widgets)
- 接管理器是Android上最,10 款优秀的 Android 文件管理器
- 5分钟三句代码实现抖音自动下载
- 万年历的实现——C++Java版
- 代理xp组件已作为此服务器安全配置的一部分被关闭
- Footprint 8月月报 DeFi市场多点开花,9月是否会迎来下一个爆发点
- Win7报错:Explorer.EXE不支持此接口的解决办法
- JVM内存分哪几个区,每个区的作用是什么?
- GeoTrans2.4.1 用户手册 之 (三)协调转换和数据传输
- 队列的定义及其基本操作
- 计算机丢失系统文件如何找回,电脑引导文件丢失怎么办 引导文件丢失恢复方法...
热门文章
- s11.1 lsof:查看进程打开的文件
- robotstudio仿真搬运编程_敲黑板 | 机器人是怎么完成任务的?这三种编程方式的区别你造吗...
- 90年代人们使用计算机,上世纪90年代电脑走进普通家庭 你还记得长什么样吗?
- 客户端突如其来的“白屏”等待该如何解决?
- 海口只有阳光沙滩?错,人家还是“最佳智慧城市”
- 如何规范你的Git commit?
- 高德深度信息接入的平台化演进
- 性能提升2.58倍!阿里最快KV存储引擎揭秘
- ubuntu安装postman
- Tomcat可运行源码资源分享