初探ATL创建进程外服务器 (ATL #2)

ATL COM向导可以创建三种服务器类型,动态链接库(DLL,dynamic link library),可执行程序(EXE,executable)及NT的系统服务(Exe,Service),我们知道,WIN32系统运行于保护模式之下,每个应用程序的内存地址都是保护的虚拟的内存地址,进程间的数据通信远较进程内的数据通信更为复杂,因为进程内的线程或对象之间的块数据传递可以直接传递指针,但进程间的数据传递却需借用系统中更为复杂的进程间通信机制,ATL COM对象是怎样在单独的服务器内为其它进程提供服务的呢。

最好的办法当然是实践,做个范例程序试试。

生成的代码的区别:
1、对EXE服务器,向导生成与DLL服务器相同的文件,但没有.DEF文件,毕竟EXE服务器不象DLL服务器一样导出入口函数。DLL服务器通过DllRegisterServer和DllUnRegisterServer导出服务器注册及注销函数。而EXE服务器通过参数
/RegServer和/UnRegServer完成服务器注册及注销功能。
没有DllGetClassObject和DllCanUnloadNow。

2、DLL服务器_Module是CComModule的实例,而EXE服务器的_Module是CComModule的派生类CExeModule的实例,覆盖其UnLock()方法,此外,它定义两个方法MonitorShutdown和StartMonitor。这个新的派生类监视模块上的锁并在适当的时候退出,完成EXE服务器的卸载。

相同之处:
原来对服务器增加ATL对象,属性及方法等,和DLL服务器相同。由系统保证ATL COM对象的跨进程通信。

对于服务器是EXE服务器时,系统提供COM客户一种特殊的对象,叫做"代理",代理是一个对象,它和客户位于相同的地址空间,并且能对目标组件所支持的所有接口作出反应,从客户的角度来说,代理就是组件。
当客户调用某一个组件接口在内的一个方法时,代理把所有的方法参数捆绑于某一可移动的数据结构集合内,并装整个集合通过远程调用发送至本地服务器程序,国为微软的RPC技术使得程序可以跨地址空间进行通信,所以代理能够轻易地将方法参数移入本地服务器的地址空间。
在服务器方,RPC被一个称为占位模块的代码接收,当方法调用完成后,组件将控制权返回给占位模块(连同所有返回参数),占位模块将返回参数捆绑在一起,包装成一个可移动的格式,然后将它们通过RPC返回给代理,代理从返回数据中取出所有的返回值,并将控制权交回客户。

进程外和进程对COM服务器的优点对比。
由于进程外服务器是在独立的进程空间运行,可以使得整个系统更为键壮,因为一个进程的非法操作不会影响另一个进程,尤其是COM服务器不太稳定的时候。
而进程内服务器是在客户相同的进程空间运行,避免了RPC的调用开销,使得调用过程更为高效。速度更快。

ATL向导支持COM服务器提供四种线程模型选项,Single,Apartment,Both,Free,用于支持单线模型,单元线程模型和自由线程模型。下次再学吧。

还是太菜,勤学苦练COM中。

你可能感兴趣的:(ATL,学习手札)