COM设计与实现范例

原创 2002年05月24日 12:21:00

COM设计与实现范例

原创作者: 小王志东,王健

创作日期:200245日星期五<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

件对象模型是一种跨平台技术,是现代面向对象分析与设计的技术实现手段之一,就现实系统应用来看,COM技术有着很强的实用价值。

OOA -> OOD -> OOP 用纯面向对象技术分析设计实现系统

就给出一个简单的范例来展示其魅力。系统描述:本系统是一个多用户登录管理系统。要求用户通过输入用户编号和密码登录系统,如登录成功则显示成功消息,否则显示错误消息。系统分析:类的抽取,根据关键词抽取出用户类,根据用户类衍生出用户管理员类。

COM接口定义 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 

unit UnionComs_TLB;

 

// ************************************************************************ //

// WARNING                                                                   

// -------                                                                    

// The types declared in this file were generated from data read from a      

// Type Library. If this type library is explicitly or indirectly (via       

// another type library referring to this type library) re-imported, or the  

// 'Refresh' command of the Type Library Editor activated while editing the  

// Type Library, the contents of this file will be regenerated and all       

// manual modifications will be lost.                                        

// ************************************************************************ //

 

// PASTLWTR : $Revision:   1.130  $

// File generated on 2002-4-5 11:34:29 from Type Library described below.

 

// ************************************************************************  //

// Type Lib: D:/stevenbob/exmines/UnionComGroup/Coms/UnionComs.tlb (1)

// LIBID: {A5265797-1AE4-4465-B5BA-67CB3E5F615E}

// LCID: 0

// Helpfile:

// DepndLst:

//   (1) v2.0 stdole, (C:/WINNT/System32/stdole2.tlb)

//   (2) v4.0 StdVCL, (C:/WINNT/System32/STDVCL40.DLL)

// ************************************************************************ //

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.

{$WARN SYMBOL_PLATFORM OFF}

{$WRITEABLECONST ON}

 

interface

 

uses ActiveX, Classes, Graphics, StdVCL, Variants, Windows;

 

 

// *********************************************************************//

// GUIDS declared in the TypeLibrary. Following prefixes are used:       

//   Type Libraries     : LIBID_xxxx                                      

//   CoClasses          : CLASS_xxxx                                     

//   DISPInterfaces     : DIID_xxxx                                      

//   Non-DISP interfaces: IID_xxxx                                       

// *********************************************************************//

const

  // TypeLibrary Major and minor versions

  UnionComsMajorVersion = 1;

  UnionComsMinorVersion = 0;

  LIBID_UnionComs: TGUID = '{A5265797-1AE4-4465-B5BA-67CB3E5F615E}';

  IID_IUserGroup: TGUID = '{D168EB08-8C53-41F7-9B4C-B1EA0120C1DA}';

  CLASS_UserGroup: TGUID = '{91648D17-4920-48A1-BC8E-94E6A70AA31B}';

  IID_IUser: TGUID = '{8CC77A6A-0D6B-4646-8DD2-D3E3853C46B7}';

  CLASS_User: TGUID = '{EA6025AF-6F8C-4201-8DF4-BE5DB86D061A}';

type

// *********************************************************************//

// Forward declaration of types defined in TypeLibrary                   

// *********************************************************************//

  IUserGroup = interface;

  IUser = interface;

  IUserDisp = dispinterface;

 

// *********************************************************************//

// Declaration of CoClasses defined in Type Library                      

// (NOTE: Here we map each CoClass to its Default Interface)             

// *********************************************************************//

  UserGroup = IUserGroup;

  User = IUser;

 

 

// *********************************************************************//

// Interface: IUserGroup

// Flags:     (4096) Dispatchable

// GUID:      {D168EB08-8C53-41F7-9B4C-B1EA0120C1DA}

// *********************************************************************//

  IUserGroup = interface(IDispatch)

    ['{D168EB08-8C53-41F7-9B4C-B1EA0120C1DA}']

    function  CreateUser(ID: Integer; const UserName: WideString; const UserPwd: WideString;

                         out ppUser: User): HResult; stdcall;

    function  GetCount(out plCount: Integer): HResult; stdcall;

  end;

// *********************************************************************//

// Interface: IUser

// Flags:     (4416) Dual OleAutomation Dispatchable

// GUID:      {8CC77A6A-0D6B-4646-8DD2-D3E3853C46B7}

// *********************************************************************//

  IUser = interface(IDispatch)

    ['{8CC77A6A-0D6B-4646-8DD2-D3E3853C46B7}']

    function  Get_Name: WideString; safecall;

    procedure Set_Name(const Value: WideString); safecall;

    function  Get_ID: Integer; safecall;

    procedure Set_ID(Value: Integer); safecall;

    function  Get_Password: WideString; safecall;

    function  ChangePassword(const OldPwd: WideString; const NewPwd: WideString;

                             const CfmPwd: WideString): Integer; safecall;

    property Name: WideString read Get_Name write Set_Name;

    property ID: Integer read Get_ID write Set_ID;

    property Password: WideString read Get_Password;

  end;

 

// *********************************************************************//

// DispIntf:  IUserDisp

// Flags:     (4416) Dual OleAutomation Dispatchable

// GUID:      {8CC77A6A-0D6B-4646-8DD2-D3E3853C46B7}

// *********************************************************************//

  IUserDisp = dispinterface

    ['{8CC77A6A-0D6B-4646-8DD2-D3E3853C46B7}']

    property Name: WideString dispid 2;

    property ID: Integer dispid 3;

    property Password: WideString readonly dispid 4;

    function  ChangePassword(const OldPwd: WideString; const NewPwd: WideString;

                             const CfmPwd: WideString): Integer; dispid 5;

  end;

 

// *********************************************************************//

// The Class CoUserGroup provides a Create and CreateRemote method to         

// create instances of the default interface IUserGroup exposed by             

// the CoClass UserGroup. The functions are intended to be used by            

// clients wishing to automate the CoClass objects exposed by the        

// server of this typelibrary.                                           

// *********************************************************************//

  CoUserGroup = class

    class function Create: IUserGroup;

    class function CreateRemote(const MachineName: string): IUserGroup;

  end;

 

// *********************************************************************//

// The Class CoUser provides a Create and CreateRemote method to         

// create instances of the default interface IUser exposed by             

// the CoClass User. The functions are intended to be used by            

// clients wishing to automate the CoClass objects exposed by the        

// server of this typelibrary.                                           

// *********************************************************************//

  CoUser = class

    class function Create: IUser;

    class function CreateRemote(const MachineName: string): IUser;

  end;

 

implementation

 

uses ComObj;

 

class function CoUserGroup.Create: IUserGroup;

begin

  Result := CreateComObject(CLASS_UserGroup) as IUserGroup;

end;

 

class function CoUserGroup.CreateRemote(const MachineName: string): IUserGroup;

begin

  Result := CreateRemoteComObject(MachineName, CLASS_UserGroup) as IUserGroup;

end;

 

class function CoUser.Create: IUser;

begin

  Result := CreateComObject(CLASS_User) as IUser;

end;

 

class function CoUser.CreateRemote(const MachineName: string): IUser;

begin

  Result := CreateRemoteComObject(MachineName, CLASS_User) as IUser;

end;

 

end.

COM接口的实现

unit uUnionComsImpl;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

//  ActiveX, Mtsobj, Mtx, ComObj, UnionComs_TLB, StdVcl;

    Windows, ActiveX, Classes, ComObj, UnionComs_TLB, StdVcl;

type

  TUserRec = record

    Intf: IUser;

    bUsed: Boolean;

  end;

   TUserGroup = class(TAutoObject, IUserGroup)

  private

    FUserArray: array of TUserRec;

  protected

    function CreateUser(ID: Integer; const UserName, UserPwd: WideString;

      out ppUser: User): HResult; stdcall;

    function GetCount(out plCount: Integer): HResult; stdcall;

  public

    destructor Destroy; override;

    procedure Initialize; override;

  end;

 implementation

 uses ComServ;

 function TUserGroup.CreateUser(ID: Integer; const UserName,

  UserPwd: WideString; out ppUser: User): HResult;

var

  AIntf: IUser;

begin

  SetLength(FUserArray, Length(FUserArray) + 1);

  AIntf := CoUser.Create as IUser;

  FUserArray[Length(FUserArray) - 1].Intf := AIntf;

  FUserArray[Length(FUserArray) - 1].bUsed := True;

  AIntf.Name := UserName;

  AIntf.ID := ID;

  ppUser := FUserArray[Length(FUserArray) - 1].Intf;

end;

 destructor TUserGroup.Destroy;

var

  i: Integer;

begin

  for i := Low(FUserArray) to High(FUserArray) do

  begin

    FUserArray[i].Intf := nil;

    FUserArray[i].bUsed := False;

  end;

  SetLength(FUserArray, 0);

  inherited Destroy;

end;

 function TUserGroup.GetCount(out plCount: Integer): HResult;

begin

  plCount := Length(FUserArray);

end;

 procedure TUserGroup.Initialize;

begin

  inherited;

 end;

 initialization

  TAutoObjectFactory.Create(ComServer, TUserGroup, Class_UserGroup,

    ciMultiInstance, tmApartment);

end.

 客户端程序的实现

 Create User Button 的代码实现

procedure TForm1.Button1Click(Sender: TObject);

var

  AUserGroup: IUserGroup;

  AUser: IUser;

begin

  AUser := nil;

  AUserGroup := CoUserGroup.Create;

  AUserGroup.CreateUser(10, 'WZD', '912', AUser);

  ShowMessage(AUser.Name);

  Auser.ChangePassword('', '912', '912');

  ShowMessage(AUser.Password);

end;

 实例下载: http://www.megspace.com/computers/coreware/

VS2010 简单ATL COM开发(下)

前面一章介绍了怎么创建ATL COM组件及注册,下面简单介绍如何调用COM组件。 1、在MFC中调用有一种很方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月08日 15:11
  • 12917

COM组件学习笔记--COM组件示例

COM组件示例
  • Deadwalk
  • Deadwalk
  • 2015年03月13日 20:01
  • 1448

APP规范实例(详细的UI设计方法)

这一套UI设计规范,包含了界面布局、颜色、文字规范、按钮规范、图标规范、图片规范、列表规范、控件规范、弹出浮层,超级详细。 大家可以借鉴下,学会自己设计一套APP设计规范,成为高级设计师。但是不...
  • yybj
  • yybj
  • 2016年04月23日 21:20
  • 1491

用zrender实现工作流图形化设计(附范例代码)

 公司研发的管理系统有工作流图形化设计和查看功能,这个功能的开发历史比较久远。在那个暗无天日的年月里,IE几乎一统江湖,所以顺理成章地采用了当时红极一时的VML技术。 后来的事情大家都知道了,...
  • oaa608868
  • oaa608868
  • 2016年12月05日 23:49
  • 863

在VC中调用VB编写的COM组件范例

VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。 为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的...
  • quxiao2002
  • quxiao2002
  • 2012年09月21日 15:04
  • 689

Google在Codility.com上的一个测试范例

Task descriptionEquilibrium index of a sequence is an index such that the sum of elements at lower i...
  • zhuxiaoyang2000
  • zhuxiaoyang2000
  • 2011年02月23日 10:10
  • 2131

com3000报表子系统的设计和实现

  • 2009年03月13日 12:26
  • 394KB
  • 下载

基于COM和ASP技术的工作流管理系统的设计与实现

  • 2008年12月12日 22:28
  • 323KB
  • 下载

平台+插件软件设计思想及基于com的原型实现

       引言:我们已经习惯于一个人独立进行软件开发,每个人都使用自己的风格进行程序设计,但随着工程项目变大或者是对时间要求比较紧时,就需要几个人,十几个人,甚至是上百个人协作进行软件开发与设计,...
  • merryken
  • merryken
  • 2011年06月15日 17:24
  • 513

COM 组件设计与应用(八)——实现多接口

一、前言 从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun。当然如果想偷懒的话,我们可以把 20...
  • rundll64
  • rundll64
  • 2014年09月03日 02:33
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM设计与实现范例
举报原因:
原因补充:

(最多只允许输入30个字)