COM设计与实现范例

COM:链路设计师的实战指南 在获取最近发布的PyChOpMargPython 包的初始版本1,我对COM 无法自拔,从规范到实际实践,旨在以某种具有任何工程意义的方式解决差异。这个过程让我饱受重创、瘀伤和炮弹冲击,成为 COM 战场上饱受战争蹂躏的士兵。我写这个“实地指南”,希望能帮助其他人避免我掉进的陷阱。首字母缩略词“COM”代表通道裕量分析。COM 背后的想法是提供一种方法,让通道以一定的比特率使用,也许还有调制和/或编码方案,而不需要成熟的串行链路模拟和所有假定的包袱。 阅读详情

COM设计与实现范例

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

创作日期:2002年4月5日星期五

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

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

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

COM接口定义 

 

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/

什么是BIM,什么是CIM? 建筑信息模型分为两个层面的理解:第一是建筑模型,他首先最基础最重要的功能还是展示,就像你买房子之前会去售楼部的沙盘上看一样,缩小的模型能够从宏观展示建筑的展现效果。注意BIM只是一种数据的称呼,他并不是一种具体的数据格式,通常BIM数据的格式后缀名为.rvt,这源于BIM一般都来自于auto desk revit软件,同学们也不要把它和gltf搞混,gltf是一种手工模型的数据格式,他会有.gltf的扩展名,并且gltf一般只用于展示一些小型的手工的模型,并不能携带属性信息,比如说汽车 啊飞机啊之类的。 阅读详情

相关推荐

深入掌握COM组件设计与应用

本文还有配套的精品资源,点击获取 简介:COM(Component Object Model)组件对象模型是微软开发的一种软件组件技术,它实现了不同程序间代码和资源的共享。本资料包“COM组件设计与应用.rar”旨在帮助IT开发者深刻理解COM组件的核心概念、设计原则、应用实践,并掌握关键的技术要点,如注册和反注册、IDispatch接口、聚合、错误处理以及IUnknown...

weixin_42596011的博客 1461

城市信息模型平台顶层设计与实践-CIM-读书笔记

CIM

碳学长的博客 3221

COM组件设计与应用实战详解

接口定义语言(Interface Definition Language, IDL)是COM开发中用于声明接口结构的标准文本格式。它独立于任何具体编程语言,允许开发者以抽象的方式描述接口的方法签名、参数类型、方向修饰符以及返回值语义。通过IDL文件,可以实现跨平台、跨编译器的一致性接口定义,进而由MIDL(Microsoft Interface Definition Language)编译器自动生成C/C++头文件、代理(proxy)和存根(stub)代码,从而支持本地或远程过程调用(RPC)。

weixin_35935514的博客 795

COM组件设计与使用——概述

COM组件的设计: COM组件—— 即按照COM规范编写的组件程序,它既可以是dll也可以是exe。 下面以dll组件开发为例进行说明 假设组件名字为 test.dll        首先,根据功能需要我们要设计一些类,这些类叫做COM对象类,每个COM对象类需要一些接口来提供类的功能。我们要为每个COM对象类,提供一个CLSID,为每一个类的接口提供一个IID,用来作为COM

lovelynn的专栏 1101

C++创建COM组件及其跨语言调用范例

在现代软件开发中,组件对象模型(Component Object Model,简称COM)是一种软件组件的二进制接口标准,它允许软件组件通过一个共同的接口相互沟通。作为微软的一个基础架构,COM在Windows操作系统上广泛应用于多种编程语言之间,提供了语言无关性,被广泛用于Windows系统程序设计中,使得不同语言编写的程序能够互相协作。COM接口是通过虚拟函数表(virtual function table,V-table)实现的,它规定了组件如何与外界进行交互,如何被其他组件或者客户端调用。

weixin_31860973的博客 1023

Win API与COM组件对象集的实现指南

本文还有配套的精品资源,点击获取 简介:组件对象模型(COM)是微软提出的中间件技术,用于不同编程语言和操作系统间的软件组件交互。Win API是开发Windows应用的接口集合,包含了大量函数、结构和常量。本主题将详细讨论如何通过Win API创建和使用COM组件,包括组件的注册、接口实现、实例化及通信等关键步骤。利用微软提供的ATL和MFC库,开发者可以更容易地构建轻量...

weixin_34456923的博客 1428

COM组件对象模型

COM(Component Object Model)是一种标准。它的目的是实现软件的动态连接和无缝集成。 它一种软件组件技术标准:即建立动态的可重组的可无缝连接的跨语言的组件技术标准。 COM规范就是一套为组件架构设置标准的描述文档。符合COM的组件 以DLL形式或EXE形式发布。 它需实现动态连接和信息封装。 它可以以二进制形式发布。 它完全与语言无关。 它可以自由的升级替换而且不...

顺其自然~专栏 3401

杨老师-COM组件设计与应用全教程

COM(Component Object Model,组件对象模型)是微软公司开发的一种软件组件架构,它定义了不同软件组件之间交互的方式。作为Windows平台的核心技术之一,COM为开发者提供了一种语言无关、位置透明的对象交互方法。在深入了解COM组件技术时,我们首先需要掌握的是如何创建组件,这涉及到接口的定义与实现。在本章节中,我们将深入探讨接口设计的原则和规范,以及具体的实现步骤,这对于确保组件的健壮性和可扩展性至关重要。在COM组件设计中,接口是核心元素,它定义了组件和外界交互的方式。

weixin_42620563的博客 459

【CANOE范例程序讲解】--- Python调用CANOE运行

Python调用Canoe范例讲解

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 1959

实现与掌握COM进程外组件的简易教程

接口定义语言(IDL)对于开发COM组件来说至关重要,因为它允许开发者定义可以在不同编程语言之间共享的接口。IDL文件作为COM组件之间通信的桥梁,确保了接口的标准化描述。IDL描述了组件如何与外界通信,它是一种语言无关的描述方式,允许编译器生成不同语言版本的代理和存根代码。这使得COM组件能够被不同的语言调用,增加了组件的可重用性和互操作性。类厂是一个特殊的COM对象,它实现了接口。这个接口有两个主要方法:和LockServer。通过这些方法,类厂可以控制如何创建组件实例。

weixin_36151775的博客 1071

毕设案例|保安公司智慧管理系统的建设与开发方案

"保安公司智慧管理系统是一款专为保安行业设计的高效信息化解决方案,其核心功能涵盖了从人力资源管理到业务运营的各个方面。系统以Java作为开发语言,结合SpringMVC框架,确保了稳定性和可扩展性,而MySQL数据库则提供了强大的数据存储和处理能力。首先,系统允许用户设置各类保安,如门卫、巡逻员等,实现精细化分类管理。其次,保安信息管理模块包括详细的人事档案、资格证书、培训记录等,便于人员追踪和考核。部门和城市设置方便公司层级管理和异地项目管理。岗位设置与时间安排精确到分钟,确保排班科学合理。

muyu2980的专栏 937

COM原理与实现之一

COM原理与实现之一COM组件其实是一种特殊的对象体系,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个对象的方法,也就可以做到组件调用。COM就是统一的标准——通过接口来调用COM组件。接口是COM组件能被外界所感知的唯一的东西。  所有接口的接口都继承自IUnknown,实现了“接口查询”和“引用计数”。包含3个方法: interface IUnknown {

恒 8452

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

深入COM框架以及实现简单的COM

一丶我们要理解COM是什么(为什么理解) 现在很多人会用com(也就是ALT)但是不知道原理,如果改一点东西,那么整体的框架重来,因为你不懂改哪里,如果懂了,那么遇到问题,那么就会知道我要怎么做,是什么问题了 二丶什么是COM COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它

humor456的博客 1866

毫米波雷达IWR1843开箱演示

毫米波雷达IWR1843开箱演示

m0_56120826的博客 7776

bugku渗透测试4-writeup

三、对这个主机进行全端口的扫描,发现存在22000 ssh端口,那么可以联想到时redis写入公钥来连接主机。又来了一个新的靶场,这个靶场打下来我觉得关键就是信息收集,走了很多的弯路。八、最后一个flag是要去看cms的数据库里面,这个数据库是sqlite。把这个数据库下载下来,登录密码是加密的,就直接用token。一、入口的漏洞是在登录的时候去抓包,修改action的值。六、没想到这个第一台机器的密码,在第二台里面。七、扫描第一台主机、使用之前的密码连接成功。获取最后一台主机的root密码。

vsdfbhsdhsdfh的博客 1298

COM与COM+技术

    所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机    首先:用户一般希望能够定制所用的应用程序,而组件技术从本质上讲就是可被

Shadow的专栏 1837

2025年情感分析(SA)综述——论文阅读报告

2025年情感分析(SA)综述——论文阅读报告

Samdy_L的博客 2087

COM组件设计与应用8 - 实现多接口

下载源代码一、前言    从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun。当然如果想偷懒的话,我们可以把 200 个函数都加到这一个接口中, 果真如此的话,恐怕就没有人喜欢使用我们这个组件了。一个组件既然可以提供多个接口,那么我们在设计的时候,就应该按照函数的功能进行分类,把不同功能分类的函数

蜗牛档案室 1631

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4316

读杨老师的《COM组件设计与应用》18篇 上

 今天又快速浏览一遍杨老师的COM组件设计与应用18篇,对杨老师的敬仰之情越发强烈,语言流畅、风趣幽默,问题深入浅出的讲的很清楚。更难得的是,看到了字里行间一个技术人员快乐、谦逊的人生态度。1 COM的起源 复合文件  复合文件  像文件系统一样进行管理的文件 根存储-》子存储-》流  能够进行复合文件操作的主要有三类函数, Win API IStorage接口函数 IStream接口函数  文中

moonson的专栏 2265

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 232

COM组件设计与应用——事件和通知

 COM组件设计与应用(十四)事件和通知作者:杨老师下载源代码一、前言  我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;  我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;  我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;  ... ... ... ...  本回书开始话说 COM 的事件、

Buddy 's Workstation 1514

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

COM组件设计与应用(十三)

 COM组件设计与应用(十三)事件和通知(VC6.0)作者:杨老师下载源代码一、前言  我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;  我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;  我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;  ... ... ... ...  本回书开始话说 C

bird207的专栏 335

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

通过 JACOB 实现 Java 与 COM 组件的互操作

文章目录1 JACOB1.1 概述1.2 JACOB 项目的由来1.3 JACOB操作邮箱1.3.1 使用背景1.3.2 配置您的开发和运行环境1.3.3 实现业务逻辑1.4 JACOB操作邮箱1.4.1 环境配置:1.4.2 常用类以及方法1.4.3 初始化com线程1.4.4 创建应用程序对象1.4.5 打开文档1.4.6 保存文档1.4.7 退出wordapplication1.4.8 释放com线程 1 JACOB 1.1 概述 jacob(java com bridge,java com桥)分为两

上善若泪 6317

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

下一篇: 在Delphi中如何使用RC文件中的字符串表
ocsoft
博客等级 码龄25年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值