不管是进程内组件还是进程外组件,客户程序可以使用一致的方法创建COM对象。对于进程内组件还是进程外组件,无论是创建过程,还是客户程序对接口的调用,我们都可
以按照一般的同一进程内部函数调用的过程来理解,组件个客户之间的交互过程。但是实际情况是对于进程内组件函数的调用要比进程外组件函数的调用要复杂得多。
而存根代理对象则只是用于进程该组件,由于客户程序和对象在不同的进程空间内部,所以所以对接口的调用是间接的,但是客户程序调用进程外组件的接口函数,就如同进程
内组件的接口成员函数一样,所以这就是COM的进程透明性,对于进程外组件对象与客户程序之间的通信如下:
客户程序创建了组件对象之后,他通过接口指针调用组件对象的成员函数,但是实际上,接口指针所指的是本进程中的代理对象,客户调用的是代理对象的成员函数,由代理进
程对象通过跨进程的调用方法,与对象进程的中的存根代码通信,存根代码调用组件对象的成员函数。
PS:这是我从书上抄来的,但是觉得很重点,所以就写在这里了,现在只是先进程外组件的第一步,实现代理存根对象,
第一步是编写好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:对于代理存根对象而言呢,他不过是一个接口的定义,或者说只能是一个接口的定义,其实现并不在该代理中!