在COM组件的使用和开发过程中经常需要获取有关组件的信息。而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取。通过访问类型库就可以查看COM组件的信息。

一、类型库的基础知识介绍:

1、类型库的定义:

类型库:在类型库中以二进制的形式描述了一个或多个对象的类型信息。具体的类型信息包括:组件的CLSID、所支持接口的IID、接口的成员函数及其参数和返回值类型等。

TTypedComObject类: TTypedComObject类及其派生类提供了对类型库的支持。COM由TTypedComObject派生,而不是TComObjectFactory.Create;初始时,delphi调用了TTypedComObjectFactory.create、而不是TComObjectFactory.Create;(Delphi自动创建XXXX_TLB.pas文件;)

2、查看类型库的信息

    在组件程序中,会专门创建一个类型库文件(tlb后缀名),此类型库文件定义和实现了组件向外所提供的接口、属性、方法和事件。Delphi专门为这个文件提供 了一个Pascal版本的文件(tlb扩展名),而且自动维护这两个文件的一致性。类型库的创建是根据.tlb文件中的描述进行编译的。Tlb文件包括Attributes、Uses、Flags、Text。Text文件下面给出一段文件描述:通过coclass关键字定义了对象类型信息,将据此建立相应的包装类。library关键字描述了当前库信息,并可通过importlib关键字引入其他的类型库。

[

uuid(B8DF2272-9F93-454E-9A95-60E32179C925),

version(1.0),

helpstring("ProjectDCOM Library")

]

library ProjectDCOM  // 描述了当前库信息,

{

importlib("stdole2.tlb"); // 引入其他的类型库

importlib("midas.dll");

importlib("stdvcl40.dll");

[

uuid(E30249CE-0CAB-4841-ADE4-83C5F26E52C7),

version(1.0),

helpstring("Dispatch interface for EnterAssist Object"),

dual,

oleautomation

]

interface IEnterAssist: IAppServer

{

};

[

uuid(19CEE64A-4F7E-4626-AD07-FDCB6260C96F),

version(1.0),

helpstring("EnterAssist Object")

]

coclass EnterAssist  // 定义了对象类型信息, EnterAssist自己定义的名称

{

[default] interface IEnterAssist;

};

};

3、使用类型库的好处:

1>、编写自动化控制时早期连接(Early Binding);

2>、可以根据类型库中的描述信息建立相应的包装类。通过此包装类将能很方便的在客户程序中使用组件对象提供的属性和方法。

3>、实用程序可以用来读取并显示有关包含类型库的COM服务器的信息,在COM客户和服务器之间自动参数调度;

4>、类型库对某些COM服务器是必须的,例如:自动化服务器和ActiveX控件;

二、类型库操作:

1、类型库中添加接口、属性、方法和事件

1>、第一种方法:打开实现文件,选择【Edit】菜单里的【Add To Interface】命令(注意:只有打开了实现文件,这个命令才能使用),Delphi将弹出增加接口对话框。在对话框里的Interface项选择Properties/Methods-IStringGridX,然后在Declaration里写入t属性的声明(如果你选中了对话框里的Syntax Helper选项,Delphi将随时提示你应该输入的内容); 点击OK后,这个属性的相关信息将自动加入到控件的实现文件、类型库文件和对应的Pascal文件中。因为控件的接口是双向的,所以在Pascal文件里使用了读和写两个方法来实现控件的属性。 
2>、第二种方法:使用类型库文件中的工具条:可以添加接口、方法、以及属性到COM服务器中; 
注意:工具条上可以通过点击鼠标右键弹出的菜单中选择Text Labels命令打开工具条的标题;

2、类型库文件中的工具栏: 
1>、Interface(接口): 自动为每一个新建的接口产生一个GUID; 
2>、Dispinterface(派遣接口): 与接口类似,但是使用不同的派遣机制调用服务器中的方法; 
3>、CoClass(): 类别的定义,被指定给实现接口的COM对象;使用COM对象之前必须先使用一种方法从类别定义建立真正的类别对象(变量); 再从类别对象取去需要的接口;最后再从取得的接口中调用需要执行的方法或需要存取的属性; 
4>、Enumeration(枚举): 与枚举类型类似;有整数ID来指明,而不是通过集合类型; 
5>、Constant(常量):只有在枚举下才有用;可以编辑Name、Value属性; 
6>、Alias(别名): 用于定义用户要包括一条记录类型(record)或联合类型(union)中的类型; 
7>、Record(记录类型): 记录结构; 
8>、Union(联合类型): 等同于Pascal Variant类型; 
9>、Module(模块): 模块是方法和常量的集合; 
10>、Method(方法): 输入参数(in)、输出参数(out)、可变参数(var); 
11>、Property(属性): 只读、只写、读写三种; 
12>、Refresh(更新): 使Delphi更新源文件; 
13>、Register(注册): 编译COM服务器并把服务器注册到Windows中; 
14>、Export(输出到IDL): 在MIDL或Corba格式中很有用;

3、类型库文件中的对象列表和页控件:

对象列表(Object List):显示服务器中定义的接口、方法等,点击会显示相应的情况,然后还可以添加以下东西; 
页控件(Page control):显示对象列表中当前选中的接点的类型信息。包括Attributes、Uses、Flags、Text; 
类型库也是一种资源; 
不必在客户应用程序中直接读取类型库;

http://www.vckbase.com/module/articleContent.php?id=4373

Delphi COM编程技术三类型库(库文件中的工具栏,很全)的更多相关文章

  1. DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素. 我们需要以下几个步骤: 创建并初始化CPaintManagerUI对象. 创建CDialogBu ...

  2. APUE(unix环境高级编程)第三版---first day---部署书中实例的运行环境(apue.h)

    操作环境:RHEL7.0 部署apue.h实例运行环境 1.下载头文件src.3e.tar.gz 2.解压 tar zxvf src.3e.tar.gz 3.创建普通用户(我仿照书上创建的sar用户) ...

  3. C++界面库(十几种,很全)

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

  4. Java 并发编程(三)为线程安全类中加入新的原子操作

    Java 类库中包括很多实用的"基础模块"类.通常,我们应该优先选择重用这些现有的类而不是创建新的类.:重用能减少开发工作量.开发风险(由于现有类都已经通过測试)以及维护成本.有时 ...

  5. 接口自动化(三)--读取json文件中的数据

    上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 cla ...

  6. .NET 线程池编程技术

    摘要 深度探索 Microsoft .NET提供的线程池, 揭示什么情况下你需要用线程池以及 .NET框架下的线程池是如何实现的,并告诉你如何去使用线程池. 内容 介绍 .NET中的线程池 线程池中执 ...

  7. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

  8. c++ primer 第三章 标准库类型

    1. string 标准库 1.1初始化 string s1; 默认构造函数s1为空 string s2(s1); 将s2初始化为s1的一个副本 string s3("value" ...

  9. Caffe、TensorFlow、MXnet三个开源库对比

    库名称 开发语言 支持接口 安装难度(ubuntu) 文档风格 示例 支持模型 上手难易 Caffe c++/cuda c++/python/matlab *** * *** CNN ** MXNet ...

随机推荐

  1. light 1012 Guilty Prince

    题意:一共有 T 组测试数据,每组先给两个数,w,h,表示给一个 高h,宽w的矩阵,‘#’表示不能走,‘.’表示能走,‘@’表示起始点,问,从起始点出发能访问多少个点. 简单的BFS题,以前做过一次. ...

  2. dpkg, APT, aptitude常用命令

    Install dpkg --install, -i [deb] apt-get install [package] aptitude install [package] Remove dpkg -- ...

  3. nginx,wsgi,flask之间的关系

    之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看Web 服务器层对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求 ...

  4. ctype.h 字符分类与转换

      函数及说明 1 int isalnum(int c)该函数检查传递的字符是否是字母数字. 2 int isalpha(int c)该函数是否传递的字符是字母. 3 int iscntrl(int ...

  5. 鼠标拖放div 实现

    Javascript的mousemove事件类型是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动1个像素),就会触发mousemove事件.该事件响应的灵敏度主要参考鼠标指针移动速度的快慢, ...

  6. C++字符串之一(字符表示)

    在C++中有两种类型可以用于表示字符,char和wchar_t. 但是字符串格式的标准却有很多种,如ASCII,UTF8,UTF16,UTF32等等.字符串的格式和char/wchar_t 的关系是什 ...

  7. 人生第一场组队赛---2014.8 zju monthly

    暑期集训中段就组了队,不过一直没机会打比赛 昨天kitkat突然发现了zju要搞月赛,我想了一下题目对于我这种渣实在是有点难,于是想到干脆打一次组队赛吧,跟队友商量了一下也同意了 12点---17点  ...

  8. 并查集及其简单应用:优化kruskal算法

    并查集是一种可以在较短的时间内进行集合的查找与合并的树形数据结构 每次合并只需将两棵树的根合并即可 通过路径压缩减小每颗树的深度可以使查找祖先的速度加快不少 代码如下: int getfather(i ...

  9. #include <fstream>

    1 fstream 2 ifstream 3 ofstream 4 seekg 5 seekp 6 tellg 7 tellp 1 fstream 打开输入输出文件流 #include <ios ...

  10. oracle10G之前介质下载地址【珍藏版】

    今天在互联网搜了一下相关介质下载,自己记录一下. Oracle9i Database Release 2 Enterprise/Standard/Personal Edition for Window ...