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