非COM环境下的接口编程

非COM环境下的接口编程,第1张

非COM环境下的接口编程,第2张

接口的概念由来已久。早在COM出现的时候(COM应该是95年左右),接口的概念就已经深入到面向对象的发展中。的设计模式(1994年发布)也指出“为接口编程而不是为实现编程”。使用接口可以减少软件系统中不同模块的耦合,有利于软件系统的更新和维护。接口的优势肯定不仅仅在COM,其实在大多数编程任务中接口都是一个不错的选择。(用delphi开发过Web Service的朋友都知道,delphi也用接口来描述Web Methord,所以接口的概念在面向对象领域永远不会过时。)本文不是讨论COM的文章,而是举例说明接口在delphi中的实际作用,开发中可能遇到的问题以及需要的技巧


示例:

※第一印象:

熟悉Windows编程的人应该已经在自己开发的系统中使用了dll。如果我们要把对象放在dll中进行维护(不仅仅是一些函数和过程)怎么办?想到的最简单的答案就是用COM。我还能做什么?使用delphi中的动态包bpl或其他一些方法(如内存复制)可能会解决这个问题。然而,现在我们想要创建一个标准的DLL文件。我们可以像COM一样通过接口直接操作和维护其中的对象,但不需要像COM组件一样注册。只要像普通DLL文件一样加载,应该可以正常工作。这个优势很明显。也许我们需要一个像大多数绘图软件一样允许插件扩展的程序。除了标准的COM技术,我们还可以把实现约定接口的对象(也就是插件契约)放在一个标准的DLL库中,在一个可以由用户配置的文件中,按照不同插件的名称和路径,在主应用程序中依次加载这些DLL。这样,我们的插件下载到客户的电脑上后,根本不需要任何注册和安装过程,只需要在主应用程序中进行配置即可。这个过程看起来是这样的:

对于I:=0到PluginCount-1 do

//PluginCount是从配置文件中“安装”的插件数。

开始

dllhnd[I]:= loadlibrary(plug path);

//PlugPath是每个dll的路径,是前一个程序从栽培文件中获取的。

@ GetPlugIntf:= GetProcAddress(dll hnd[I],' GetPlugIntf ');

PlugIntf[I]:= GetPlugIntf;//GetPlugInth可以返回一个IunKnown的接口。

结束;

现在我们把每个插件的接口都加载好了,可以操作了。从上面的代码中,我们大致可以看到一些我们管理对象所需要的DLL的样子:这个DLL只有一个导出函数来获取其中维护的对象的接口(GetPlugIntf,可能还有其他的导出函数,但这是必须的),这个函数既可以返回一个对象实现的接口,也可以直接返回Iunknown接口(方便用数组管理所有插件接口,也有利于实现循环结构的程序,如上图所示),还有主程序。另外,我们的主程序需要和Dll共享一个描述接口的文件(契约)。return接口导出的函数如下所示:

定义变量

our object:TintfObject;

函数getfoobjectintf:I unknown;stdcall

开始

如果没有赋值(我们的对象)

开始

OurObject:= TintfObject。创建;

结束;

结果:= OurObject as IUnKnown

结束;

通过上面的描述可以看出,在一个普通的DLL中维护对象,像COM一样发布对象的接口,也是一件很简单的事情,没什么特别的。但是上面的讨论有一个很大的问题:如果我们的DLL只有一个导出函数,就意味着只能导出一个对象的接口,就像上面的一样,但是如果我们要在这个DLL中维护多个对象(尤其是一些按照继承关系连接的对象族,或者那些有共同特征的对象族
怎么办

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 非COM环境下的接口编程

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情