COM编程--学习笔记

C++与COM 对象通信方法

1、调用COM DLL时COM不需要做什么特别的工作;
2、但是调用COM EXE服务器上的方法时,在实际过程中程序并不是马上进入被调用的函数,而先执行一个“代理”的中间函数:代理函数将调用的参数序列化为标准的COM客户/服务器协议的格式,然后放到连向COM EXE的信道中;在信道的另一端是一个叫做“桩子”的函数,“桩子”函数将参数包解开,真正实现对所请求方法的调用;总之,COM为你做了以前你必须自己完成的通信工作,对于有返回值的方法,桩子和代理交换一下动作。
3、代理和桩子函数的产生:由COM自动完成,当CoCreateInstance()创建对象时,不仅启动了相应的EXE,而且返回了对象的指针,返回的指针给代理函数;因此,根据你所创建的对象的类型不同,你或者得到真实对象的指针,或者得到指向代理函数的指针。
4、代理函数从何而来?实际上来自一个代理/桩子DLL;CoCreateInstance()查看系统注册表中的Interface()键将接口ID映射到DLL文件名,从而找到所需要的DLL文件,然后在你的“应用程序”和“COM EXE服务器端”都装入这个DLL。COM根据接口ID请求EXE所建所需要的类的对象;
COM将同一个接口ID映射到系统注册表中的代理/桩子DLL文件;
COM调用LoadLibrary()在客户和EXE服务器两端都装载同一个DLL;
代理/桩子DLL用于在网络通信的过程中打包和解开参数;
5、不要在应用程序之间交换内存指针: 进程空间 在程序中出现的数据指针(char *p),指向的其实不是内存中真正的物理地址,而是应用程序换入内存时CPU指定给程序的逻辑地址。因为如果CPU给你的程序指定的是物理地址,那么当程序在内存中换入换出来说可能毫无意义,在应用程序之间传递数据时应该直接传递数据,而不要传递指针。
6、COM术语; 把COM DLL称为“在进程中”,把COM EXE成为“在进程外”; 把在本地系统执行的COM EXE称为“本地服务器”; 把在别的系统执行的COM EXE称为“远程服务器”; 当使用COM访问远程的COM EXE时,实际上采用的是分布式COM技术(DCOM),而不是普通的COM技术。

怎样消灭COM对象
1、对象自己维护一个引用计数器;
2、COM也会自动清理你的COM对象; 每当创建COM对象的一个指针时,对象的引用计数加1;每当客户端用完COM对象,对象的引用计数减1; 当引用计数减到零时,COM卸载DLL或终止EXE; COM的EXE服务器自动监测客户端是否仍激活这,如果客户端的应用程序已死锁,则自动将引用计数减1; Marshalling COM数据 代理/桩子或COM DLL将方法的调用参数转化成NDR格式(网络数据表示); COM调用RPC将格式化的数据传递给服务器端的COM代理/桩子或COM DLL; 服务器端的COM代理/桩子或COM DLL将数据还原成参数表,放到调用堆栈或为指针参数而开辟的内存中; 服务器端的COM代理/桩子或COM DLL,然后调用COM服务器的方法;

转载于:https://www.cnblogs.com/shelvenn/archive/2007/12/24/1012889.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值