转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
组件技术的本质COM实例分析一         ★★★★

组件技术的本质COM实例分析一

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2733 更新时间:2009/4/23 18:38:00
  protected

  end;

 

const

  Class_Accemp: TGUID = ''''{561FA61C-A985-4F70-8B5A-DF40BA9A7ED8}'''';

implementation

 

uses ComServ;

 

initialization

  TComObjectFactory.Create(ComServer, TAccemp, Class_Accemp,

    ''''Accemp'''', ''''实例分析'''', ciMultiInstance, tmApartment);

end.

我们对以上的代码作一个简短的分析:

Taccemp 是一个产生的类。回忆一下,在向导中我们指定Accemp为类名,Delphi自动的加入“T”。

Class_Accemp常量是一个代表COM服务器的GUID。服务器中实现的每个接口都会有自己的一个GUID;

单元的初始化部分包括一个单一却复杂的构造函数调用。这个调用建立了负责创建Taccemp COM对象的类厂。

TcomObjectFactory.Create在ComObj.Pas中定义如下:

constructor TComObjectFactory.Create(ComServer: TComServerObject;

  ComClass: TComClass; const ClassID: TGUID; const ClassName,

  Description: string; Instancing: TClassInstancing;

  ThreadingModel: TThreadingModel);

begin

  IsMultiThread := IsMultiThread or (ThreadingModel <> tmSingle);

  if ThreadingModel in [tmFree, tmBoth] then

    CoInitFlags := COINIT_MULTITHREADED else

  if (ThreadingModel = tmApartment) and (CoInitFlags <> COINIT_MULTITHREADED) then

    CoInitFlags := COINIT_APARTMENTTHREADED;

  ComClassManager.AddObjectFactory(Self);

  FComServer := ComServer;

  FComClass := ComClass;

  FClassID := ClassID;

  FClassName := ClassName;

  FDescription := Description;

  FInstancing := Instancing;

  FErrorIID := IUnknown;

  FShowErrors := True;

  FThreadingModel := ThreadingModel;

  FRegister := -1;

end;

结合参数来理解这个过程。

在99%的情况下,用户简单地传递作为参数COMServer的全局ComServer对象。

第二个参数ComClass接受将由类厂创建的类。在此实例中,相要此类厂创建Taccemp实例。

第三个参数ClassID获得分配给Taccemp类的GUID。既Class_Accemp;

接下来,传递类名Accemp和类的描述Description。

Instancing参数仅应用于进程外COM服务器。在此可以忽略。

Delphi的COM对象向导填入了默认值ciMultiInstance。

最后一个参数接受一个表示线程模型的值,该模型由此对象支持。而以上所介始的各个参数都可以根据它的实现代码进行参考。其实,它的实现过程更多的就是将上边所列出的参数进行位置对应。这个过程留给读者朋友们分析。当然,即使对它的内部不是很了解,也无大碍。

由上边的描述,我们来分析一下:

  TComObjectFactory.Create(ComServer, TAccemp, Class_Accemp,

    ''''Accemp'''', ''''实例分析'''', ciMultiInstance, tmApartment);

创建一个COM对象Taccemp的实例Accemp,其GUID是Class_Accemp所代表的常量描述为’实例分析’,支持多线程。

COM对象离不开接口,只有通过接口才可以将COM对象提供的服务真零点切切的被客户端去调用,接下来,我们需要进行接口的代码填充,因为要实现登录和算法的简单实现过程,按照前边所提及的,如果两个联系不是很密切的功能我们尽量放在不同的接口中,立求接口的相对独立性,其实,实际中的情况也是如此。因为接口有不变性。负责登录的接口我们仅仅需要实现两个功能于同一个接口中,如下:

  IAccIntf = Interface

    [''''{ADDFAFFE-32D0-474F-909C-155E3906F0D1}'''']

    Function GetLogn(UserName , UserPass : String) : Boolean;

    Function GetSysTime : String;

  end;

再此,笔者再次提醒,GUID应该在每个接口声明时都需要创建,假设此处将不进行接口的创建,在后边的接口分离中会出现“不支持接口”的错误提示信息,不必担心GUID会被用完,纵然再有几百年也用不完我们现有的GUID。不要想着Copy – Paster GUID;

{Delphi中,Shift + Ctrl + G 可以产生一个唯一的GUID}

上一页  [1] [2] [3] [4]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台