COM是如何进行通信的:


//


com编程python com编程精彩实例_服务器



①代理/桩子或COM DLL将方法的调用参数转化成NDR格式;


②COM调用RPC将格式化的数据传递给服务器端的COM代理/桩子或COM DLL;


③服务器端的COM代理/桩子或COM DLL将数据还原成参数表,放到调用堆栈和/为指针参数开辟的内存中;


④服务器的COM代理/桩子或COM DLL,然后调用COM服务器的方法


⑤返回参数的处理过程同上



当你调用一个方法时,参数都会被转化成标准通信协议所定义的传输格式,这个协议叫做网络数据表示(NDR)。



基本的IDL文件格式:


早绑定接口:


//


com编程python com编程精彩实例_晚绑定_02



1)使用的术语是接口而不是类


2)所有的COM类都是继承自同一个基类IUnknown。


3)类、方法、方法的参数都用括号内的关键字进一步加以定义。


晚绑定接口:


IDispatch提供了三个查询对象方法的函数和一个调用方法的函数。


1)GetTypeInfo()和GetTypeInfoCount()。


客户程序用这两个函数来标底一个支持晚绑定的COM对象的所有方法和函数。这两个方法客允许客户程序以编程的形式来查看对象的类型库,并返回调用方法的ID所需参数表。


2)GetIDsOfNames()。


给定方法名的列表,寻找与之匹配的ID。


3)Invoke()。


给定方法ID和参数表,实现方法的真正调用。


二元接口:


一个二元接口的IDL文件如下:




com编程python com编程精彩实例_IDL_03



特点:


1)有早绑定的接口ID和接口设计;


2)有晚绑定的方法ID,它派生自IDispatch。



类型库声明:


在IDL文件的最后部分是一个库声明,MIDL用它来生成类型库。


//





com编程python com编程精彩实例_IDL_04



简单参数类型:


//



com编程python com编程精彩实例_com编程python_05




①虽然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]:通知客户端,该参数必须作为方法调用的返回值被返回。