荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: oopilix (冬眠的抽象实例), 信区: Visual
标  题: [zz]《COM技术内幕》学习笔记(6)
发信站: 荔园晨风BBS站 (Mon Oct 20 13:30:03 2003), 站内信件

原作者姓名 雷神
文章原始出处 http://www.ai361.com

介绍
记得OO专家高焕堂的观点,系统的开发实际上是处在架构的驱动上的,而软件架构
的表现形式就是接口。IDL是用来描述接口的,它们之间有什么联系,雷神思考中


正文
第六部分:
IDL语言同UUID设计和RPC规范一样是从开放软件基金会(OSF)为分布式计算环境
(DCE)借用过来的。最初并不是设计为描述COM类和接口的一种方法,微软把IDL
设想为描述可用于Windows NT机器间通信的RPC接口的一种方法,后来逐步加入了
许多专用于COM组件的关键字,用来描述COM接口以及COM对象。
记得OO专家高焕堂的观点,系统的开发实际上是处在架构的驱动上的,而软件架构
的表现形式就是接口。IDL是用来描述接口的,它们之间有什么联系,雷神思考中


FAQ42:COM中的几种不同的服务程序?〖第十章〗
FAQ43:什么是COM所用的进程间通信方法本地过程调用(LPC)?〖第十章〗
FAQ44:什么是代理和存根DLL?〖第十章〗
FAQ45:什么是IDL和MIDL?〖第十章〗
FAQ46:关于DOCM(分布式的COM)?〖第十章〗
FAQ47:本地服务程序的运行步骤?〖第十章〗
FAQ48:远程服务程序的运行步骤?〖第十章〗

Question:
    COM中的几种不同的服务程序?
Answer:
    每一个EXE文件都在不同的进程中运行。
    每一个进程都有其自己的进程空间。
    因此EXE文件被称为进程外服务程序,或本地服务程序。
    DLL被映射到链接它们的EXE文件的进程空间中。
    DLL被称为进程内服务程序。
    远程服务程序指的是运行于另外一台不同的机器上的进程外服务程序。

Question:
    什么是COM所用的进程间通信方法本地过程调用(LPC)?
Answer:
    LPC是一台机器上不同进程间通信的一种方法。
    EXE中的客户通过WIN32 LPC机制来调用EXE形式组件中的函数。
    将函数调用的参数从客户进程地址传到组件进程地址空间中,这种方法叫“列
集”。
    对组件进行列集我们可以实现一个名为IMarshal的接口。
    在创建组件时,它将查询IMarshal接口。
    然后调用IMarshal成员函数以便在调用函数的前后列集或散集有关的参数。
    COM库实现了一个大多数接口可用的IMarshal标准版本。

Question:
    什么是代理和存根DLL?
Answer:
    客户与一个模仿组件的DLL进行通信,这个DLL可以完成参数的列集,此组件被
称为代理。
    一个代理就是同另一个组件行为相同的组件。
    代理必须是DLL形式。
    组件还需要一个存根的DLL,以便对从客户传来的数据进行散集。
    存根也将对传回给客户的数据进行列集。

Question:
    什么是IDL和MIDL?
Answer:
    IDL是接口定义语言。
    MIDL是Microsoft的IDL编译器。
    在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理
和存根DLL的C代码。
    一个例子:
    import “unknown.idl”    ///用于将其他IDL文件中的定义包含到当前文件

    ///Interface IX
[    ///注意是[ ]不是 {}
    object,    ///所定义的接口是一个COM接口
    uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682),    ///相应的接口IID
    helpstring(“IX Interface”),    ///将帮助串放入类型库
    pointer_default(unique)    ///这类指针可以为空,函数内可以修改它们的
值,但不能指定别名
]
    interface IX:IUnknown
{
    ///in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送
回任何值。
    HRESULT FxStringIn([in,string]wchar_t* szIn);
    ///out关键字告诉MIDL参数仅被用来从组件向客户传回有关的数据,
///代理不需要对输出参数进行列集,也不需要将参数传给组件。
    HRESULT FxStringOut([out,string]wchar_t* szout);
    ///COM对字符串的标准约定是Unicode字符(即wchar_t)
}
    IDL文件可以定义C和C++风格的结构,并可用它们作为函数的参数。
    当IDL文件中有一个library时,MIDL将生成一个类型库。
    MIDL为接口生成相应的代理和存根的C代码。
    为得到一个代理/存根DLL,需要编译和链接MIDL生成的C文件。
    宏REGISTER_PROXY_DLL将完成代理/存根DLL在注册表中的注册操作。
    有了IDL和MIDL我们就可以象调用进程内组件那样进行跨进程边界的函数调用
,并对参数进行列集。

Question:
    关于是DCOM(分布式COM)?
Answer:
    CLIENT.EXE和SERVER.EXE可以通过一个网络而一起工作。
    DCOM(Distributed COM 分布式的COM)。
    为了客户使用远程服务程序,需要用到DCOM的配置工具DCOMCNFG.EXE。
    这个工具可以让用户修改系统中安装的应用程序的各种参数。
    DCOM创建了AppID用来保存一个默认值一个友好的名称,一个应用程序所在的
服务器的名称值(RemoteServerName),和DCOM如何运行相应的应用程序值(
RunAs)。
    需要用CoCreateInstanceEX替换CoCreateInstance,或修改
CoGetClassObject的调用。
    DCOM还为了减少QueryInterface造成的影响,创建了一个MULTI_QI的新结构。
用来同时查询多个接口。
    为决定DCOM是否可用,可以检查OLE32.DLL是否支持自由线程模型。

Question:
    本地服务程序的运行过程?
    远程服务程序的运行步骤?
Answer:
    因为几乎可以不对CLIENT.EXE和SERVER.EXE做任何修改,就可以使它们通过一
个网络而一起工作,因此将上面的两个问题一同回答。每个步骤后会注明此步骤归
属本地系统(本)还是远程系统(远)。
运行DCOMCNFG.EXE这个工具就可以把本地服务程序变成远程服务程序。
    建立CLIENT.EXE、SERVER.EXE以及PROXY.DLL。(本)。
    将CLIENT.EXE、SERVER.EXE以及PROXY.DLL复制到远程系统。(远)
    使用命令server/RegServer注册本地服务程序。(本)(远)
    使用命令regsvr32 Proxy.dll注册代理。(本)(远)
    运行CLIENT.EXE,并选择本地服务程序选项,确保程序在两个系统中都能正常
工作。(本)(远)
    运行DCOMCNFG.EXE。选择相应的组件并单击Properties。然后选择Location选
项卡,取消对Run Application On This Computer的选择,并选择Run
Application On The Following Computer选项,然后输入将要运行的SERVER.EXE
的远程机器名。(本)
    单击Identity选项卡,然后选择Interactive User单选按钮。(本)
    根据自己的访问权限,可能需要对Security选项卡上的选项进行设置。(本)
(远)
    运行SERVER.EXE观察其输出。(远)
    运行CLIENT.EXE选择第二个选项以选择本地服务程序。(本)
    此时服务器的窗口中应该可以看到相应的输出。(远)
    输出也应该出现在同CLIENT.EXE相关联的控制台窗口中。(本)



--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店