生成COM存根代理对象-进程透明性

      不管是进程内组件还是进程外组件,客户程序可以使用一致的方法创建COM对象。对于进程内组件还是进程外组件,无论是创建过程,还是客户程序对接口的调用,我们都可

以按照一般的同一进程内部函数调用的过程来理解,组件个客户之间的交互过程。但是实际情况是对于进程内组件函数的调用要比进程外组件函数的调用要复杂得多。

     而存根代理对象则只是用于进程该组件,由于客户程序和对象在不同的进程空间内部,所以所以对接口的调用是间接的,但是客户程序调用进程外组件的接口函数,就如同进程

内组件的接口成员函数一样,所以这就是COM的进程透明性,对于进程外组件对象与客户程序之间的通信如下:

     客户程序创建了组件对象之后,他通过接口指针调用组件对象的成员函数,但是实际上,接口指针所指的是本进程中的代理对象,客户调用的是代理对象的成员函数,由代理进

程对象通过跨进程的调用方法,与对象进程的中的存根代码通信,存根代码调用组件对象的成员函数。


   PS:这是我从书上抄来的,但是觉得很重点,所以就写在这里了,现在只是先进程外组件的第一步,实现代理存根对象,

    第一步是编写好idl文件,举例如下:



// stub.idl : stub 的 IDL 源
//

// 此文件将由 MIDL 工具处理以
// 产生类型库(stub.tlb)和封送处理代码。

import "oaidl.idl";
import "ocidl.idl";

[
	object,
	uuid(3D92CDC6-6E92-4372-9DB1-A2DD09B8CE7C),
	dual,
	nonextensible,
	pointer_default(unique)
]
interface Ihehe : IDispatch{
};
[
	uuid(59713965-880D-456E-BA6A-BFD105615B68),
	version(1.0),
]
library stubLib
{
	importlib("stdole2.tlb");
	[
		uuid(01501988-5FCD-4856-B9B8-121FF97D3BBE)		
	]
	coclass hehe
	{
		[default] interface Ihehe;
	};
};

import "shobjidl.idl";

第二步使用:midl工具,此工具在开始菜单->VCS2010的文件夹下->点击工具进入cmd命令提示,进入idl文件所在的目录,接下来会生成5个文件

dlldata.c,ew.h,ew.tlb,ew_i.c,ew_p.c,除此之外,

第三步,新建一个txt文件,向里面写入

LIBRARY Ihehe;//Ihehe和前面的idl文件相匹配
DESCRIPTION 'HEHHE'
EXPORTS 
DllGetClassObject @1 PRIVATE
DllCanUnloadNow   @2 PRIVATE
GetProxyDllInfo   @3 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE

将名字改成ew.def即可

第五步,使用VS2010新建一个win32控制台的项目,当然要新建一个dll的空项目,将之前的6个文件添加进来,关于该工程的属性->c++->预处理器添加REGISTER_PROXY_DLL,链接器->输入->添加附加依赖项rpcrt4.lib
uuid.lib

第六步,编译执行即可。生成代理存根dll完成。还要使用regsvr32 你懂得

PS:对于代理存根对象而言呢,他不过是一个接口的定义,或者说只能是一个接口的定义,其实现并不在该代理中!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值