COM原理与应用(2)

COM 实现
l  进程内组件【 DLL
 (1)   C++ 语言中,为了使编制的 DLL 程序更为通用,一般指定 DLL 的引出函数使      _stdcall 调用习惯,如果使用了 _cdecl 调用习惯,则有些编程语言环境就不能使用这   DLL 程序。 C++ 编译器为 DLL 程序的每个引出函数生成了一个修饰名,这些修饰名对于不同的编译器并不兼容,因此,从通用性的角度出发,我们在每个函数定义前面
加上 extern “C” 说明符。
Extern “C” int _stdcall myFunction(int n);
然后按照传统的编程方法,写一个 DEF 文件,描述 DLL 程序模块信息。
;DictComp.def : Declares the module parameters for the DLL.
LIBRARY “DictComp”
DEscRIPTION ‘Dictionary component windows Dynamic Link Library”
EXPORTS
   CreateObject @ 1
或者不用 DEF 文件 使用 _declspec(dllexport)
Extern “C” _declspec(dllexport) int _stdcall myFunction(int n);
(2) 客户端程序:有三个系统函数可用于操作 DLL 程序,装载 DLL 模块寒素 LoadLibrary 取引出函数地址的函数 GetProcAddress, 释放 DLL 程序的函数 FreeLibrary
     hModual =  LoadLibrary(“DictComp.dll”);
     if(hModual == NULL)
             return 1;
     typedef BOOL(_stdcall* MyFunctiointype)(const CLSID& clsid, const IID& iid, void **ppv);
   MyFunctionType fnCreateObject;
   fnCreateObject = (MyFunctioinType)GetProcAddress(hModual, “CreateObject”);
   fnCreateObject(clsid, iid, ppv);
   …..
   FreeLibrary(hModual);
l  进程外组件【 exe 】【 P58
问题:
(1)    一个进程如何调用另一个进程中的函数;
(2)    参数如何从一个进程被传递到另一个进程中。
Windows 平台上,在不同进程之间进行通信的办法很多,包括动态数据交换( DDE ),命名管道( named pipe )或者共享内存等等呢个。 --COM 采用了本地过程调用( LPC )和远程过程调用( RPC )的方法进行进程之间的通信,其中 LPC 用于在同一机器上得不同进程之间进行通信;而 RPC 用于在不同机器上的进程之间进行通信。 LPC RPC 的机理相同,但由于 RPC 需要通过网络传递信息,因此 RPC LPC 更为复杂,而 LPC 相当于一个优化了的 RPC 实现。
实现进程外组件工作:除了实现组件程序外,还应该实现代理 DLL 存根 DLL 两个程序模块。 而代理 DLL 和存根 DLL 只与 COM 接口有关,它只负责接口成员函数调用过程中的中间处理工作,所以我们应该针对接口实现代理 DLL 和存根 DLL 如果我们使用 COM 预定义的标准接口或者 OLE 接口,则可以直接使用系统提供的 DLL COM 库会为我们处理这些细节。

你可能感兴趣的:(职场,com,原因,休闲)