COM编程精彩实例--COM通信
来源:互联网 发布:数据正态分布统计方法 编辑:程序博客网 时间:2024/06/01 12:07
COM是如何进行通信的:
//////
①代理/桩子或COM DLL将方法的调用参数转化成NDR格式;
②COM调用RPC将格式化的数据传递给服务器端的COM代理/桩子或COM DLL;
③服务器端的COM代理/桩子或COM DLL将数据还原成参数表,放到调用堆栈和/为指针参数开辟的内存中;
④服务器的COM代理/桩子或COM DLL,然后调用COM服务器的方法
⑤返回参数的处理过程同上
当你调用一个方法时,参数都会被转化成标准通信协议所定义的传输格式,这个协议叫做网络数据表示(NDR)。
基本的IDL文件格式:
早绑定接口:
//////
1)使用的术语是接口而不是类
2)所有的COM类都是继承自同一个基类IUnknown。
3)类、方法、方法的参数都用括号内的关键字进一步加以定义。
晚绑定接口:
IDispatch提供了三个查询对象方法的函数和一个调用方法的函数。
1)GetTypeInfo()和GetTypeInfoCount()。
客户程序用这两个函数来标底一个支持晚绑定的COM对象的所有方法和函数。这两个方法客允许客户程序以编程的形式来查看对象的类型库,并返回调用方法的ID所需参数表。
2)GetIDsOfNames()。
给定方法名的列表,寻找与之匹配的ID。
3)Invoke()。
给定方法ID和参数表,实现方法的真正调用。
二元接口:
一个二元接口的IDL文件如下:
////////
特点:
1)有早绑定的接口ID和接口设计;
2)有晚绑定的方法ID,它派生自IDispatch。
类型库声明:
在IDL文件的最后部分是一个库声明,MIDL用它来生成类型库。
//////
简单参数类型:
//////
①虽然IDL可能会允许你定义特殊的参数类型,但VB和VJ++仍要靠COM DLL才能知道如何传送这个参数。在这种情况下,OLE32.DLL不知道如何处理,而VB和VJ++支持的晚绑定接口又不允许程序员自己写代理/桩子DLL,因此COM不支持这种类型。当COM发现需要一个代理/桩子DLL,又不能找到并装载时,该怎么办呢?它不会打报错,只是尽可能地将数据传出去,剩下的就不管了,比如你要传一个数组,COM就只把数组的第一个元素传出去。
②如果你要在参数列表中使用枚举类型,那么必须在IDL文件的开头、任何其他声明之前定义这个类型。
变量的属性:
1)[in]:通知COM只将该参数从客户端传往服务器端。
2)[out]:通知COM该参数不需要传往服务器,但服务器有东西要回传给客户端。因此客户程序在调用方法前必须把该参数赋值为一个有效指针或NULL。
3)[in,out]:通知COM该参数不仅要传往服务器,结束调用时服务器还要回传给客户端。因此客户程序在调用方法前必须把该参数赋值为一个有效指针或NULL。
4)[out,retval]:通知客户端,该参数必须作为方法调用的返回值被返回。
1 0
- COM编程精彩实例--COM通信
- COM编程精彩实例--COM对象
- COM 编程
- COM编程
- COM编程
- COM编程
- COM编程
- COM 编程
- Shell精彩编程实例
- Com进程通信(Delphi2007)
- COM 实例初探
- 多线程调用COM实例
- COM 实例初探
- 获取Com实例
- [编程实例]修复exe和com后缀不能显示.reg
- COM编程实例总结(Windows服务程序)
- COM
- com
- 代理模式
- AE刷新ReFresh
- 移动开发大作业————随手记(数据库和保存到SD卡操作)
- ubuntu server u盘制作方法
- tar 命令详解
- COM编程精彩实例--COM通信
- 22.享元模式
- activemq spring mysql实现持久化
- Suse 11 Install keepalived-1.2.20
- C++偏特化
- linux下与windows下的换行符
- 关于分页插件pagination的应用及遇到的问题(用ajax请求数据进行拼接后分页显示)
- AE删除要素
- 招商软文如何写:推广诱人的广告——文芳阁传媒有话说