非COM环境下的接口编程-问题,技巧,应用

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  接口的概念由来已久,早在COM出现之前(COM应该是95年左右)接口的概念就已经在面向对象的开发中根深蒂固了,著名的《设计模式》(94年出版)中也指出“针对接口编程而不是针对实现编程”。使用接口可以降低软件系统中不同模块的偶合性,利于软件系统的更新与维护。接口的优点绝对不只是出现在COM中,事实上在大多数的编程任务中接口都是一个不错的选择。(用delphi开发过Web Service的朋友知道,delphi也是使用接口来描述Web Methord的,所以接口的概念在面向对象领域永远不会过时)本文不是一篇讨论COM的文章,而是想通过一个例子来说明在delphi中接口的实际作用,以及在开发中可能碰到的问题和所需的技巧。

  例子:

  ※第一印象:

  熟悉Windows程序设计的人应该早已经在他们开发的系统中使用到了DLL,如果我们要把对象放入DLL中维护(而不仅仅是一些函数和过程)怎么办呢?最容易想到答案是使用COM。除此之外还有什么办法呢?使用delphi中的动态包bpl或则一些其他的一些办法(如内存拷贝)也许可以解决问题。不过现在我们要创建一个标准的DLL文件,我们可以象使用COM一样直接通过接口来操作维护在其中的对象,但又不用象COM组件一样需要注册,它应该是如同普通的DLL文件样只要加载就可以正常工作。这样的优点是明显的,也许我们正在需要一个如同大多数绘图软件一样允许有插件扩充的程序,那么除了标准的COM技术外我们可以将实现约定接口(也就是插件的契约)的对象放在一个标准的DLL库中,在主应用程序中根据一份可由用户配置的文件中的不同插件名称和所在路径来依次加载这些DLL,这样我们的插件下载到客户的计算机中后根本不用任何注册安装过程,而仅仅只是在主程序中配置它就可以正常工作了。这个过程看起来象这样:

  for I:=0 to PluginCount-1 do

  //PluginCount是从配置文件中得到的已经“安装”的插件数目

  begin

  …

  Dllhnd[i]:=loadlibrary(PlugPath);

  //PlugPath为每一个dll的路径,以由前面程序从培植文件中得到

  @GetPlugIntf:=GetProcAddress(Dllhnd[i],’GetPlugIntf’);

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

  …

  end;

  现在我们就得到所加载的每一个插件的接口并可进行操作了。从上面的代码中可以大概的看出一些我们需要管理对象的DLL的样子:这个DLL只有一个唯一的导出函数以获得其中维护的对象的接口(GetPlugIntf,也有可能有其它的导出函数,但这个是必须的),这个函数可以返回一个对象实现的接口也可以直接返回Iunknown接口(这样便于用一个数组管理所有的插件接口,也利于用循环结构实现程序,就象上面看到的那样),主程序在需要的时候进行转换。另外我们的主程序需要和Dll共用一个描述接口的文件(契约)。返回接口导出的函数看起来象这样:

  var

  OurObject:TintfObject;

  …

  function GetFooObjectIntf:IUnKnown;stdcall;

  begin

  if not assigned(OurObject) then

  begin

  OurObject:= TintfObject.Create;

  …

  end;

  result:= OurObject as IUnKnown;

  end;

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

上一页123下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答