COM原理与应用(2)
原创
©著作权归作者所有:来自51CTO博客作者mo451583183的原创作品,请联系作者获取转载授权,否则将追究法律责任
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原理与应用(1)
下一篇:Form
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
详解数仓对象设计中序列SEQUENCE原理与应用
本文介绍了SEQUENCE的使用场景和相关的函数的使用方法,并对使用SEQUENCE过程中遇到的常见问题及解决方法进行了汇总。
字段 数据库 序列号 SEQUENCE GaussDB(DWS) -
COM原理与实现之一
COM原理与实现之一COM组件其实是一种特殊的对象体系,遵循一个统一的标准,使到各个软件都可以通过某种方法访问
#define #include #endif -
COM 组件设计与应用(四)
一、前言 同志们、朋友们、各位领导,大家好。 VCKBASE 不得了, 网友众多文章好。
职场 休闲 COM 组件设计与应用(四)