可以用代码在程序中实现COM的注册. 举例如下: 
(假设需要注册的文件为test.ocx)
uses OLEctl,....
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
begin
OCXHand:= LoadLibrary('c:\windows\system\test.ocx');
RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer'); 
if RegFunc <> 0 then ShowMessage('Error!');
FreeLibrary(OCXHand);
end;

olectl.pas在\source\rtl\win下.
///////////////////////
在用DELPHI编写程序时,充分利用他人的成果无疑是一条捷径。我们用的控件有的是带源码的PAS文件,有的是DCU/OBJ文件;而OLE/COM控件也是不可缺少的,由于OLE/COM控件不仅可以由DELPHI开发,还可由VB、VC、PB等其它编程语言开发,因而它可以使我们的DELPHI应用程序功能更为强大,例如用一个MP3播放控件我们就可以编写自己的MP3播放程序,

用ADO对象我们的数据库程序就可能不再依赖BDE。

  不过OLE/COM控件是需要首先注册才能使用的。通常使用OLE/COM控件,首先需要用WINDOWS自己提供的注册程序RegSvr32.EXE来注册或卸载,如“RegSvr32.EXE Mp3Play.OCX”或

“RegSvr32.EXE Mp3Play.OCX /u”。不过如果要求我们的软件用户自己来注册OLE/COM控件,那可不是一个好主意,因为我们完全可以自己在程序中注册OLE/COM控件的。下面将讨论如何在DELPHI程序中注册最为常见的DLL/OCX类型的OLE/COM控件。

一、注册OLE/COM控件的原理

  在标准OLE/COM控件中,有两个函数DllRegisterServer、DllUnregisterServer可调用,其中

DllRegisterServer函数用于注册OLE/COM控件,DllUnregisterServer用于卸载OLE/COM控件,两个函数的原型均为:function : HResult。我们可用LoadLibrary装载DLL/OCX文件,用GetProcAddress获取DllRegisterServer和DllUnregisterServer两个函数的指针,然后再直接运行这两个函数即可实现注册和卸载OLE/COM控件的操作,从而代替WINDOWS系统的RegSvr32.exe实现OLE/COM控件的注册和卸载。

二、实现过程

  上面的原理很简单,实现起来也就不难了,前提是必须熟悉动态加载DLL函数的过程。具体的实现

过程我们可以通过下面的程序代码及注释来理解。

{ 注册一个DLL形式或OCX形式的OLE/COM控件

参数strOleFileName为一个DLL或OCX文件名,

参数OleAction表示注册操作类型,1表示注册,0表示卸载

返回值True表示操作执行成功,False表示操作执行失败

}

function RegisterOleFile (strOleFileName : STRING; OleAction : Byte ) : BOOLEAN;

const

RegisterOle = 1;//注册

UnRegisterOle = 0;//卸载

type

TOleRegisterFunction = function : HResult;//注册或卸载函数的原型

var

hLibraryHandle : THandle;//由LoadLibrary返回的DLL或OCX句柄

hFunctionAddress: TFarProc;//DLL或OCX中的函数句柄,由GetProcAddress返回

RegFunction : TOleRegisterFunction;//注册或卸载函数指针

begin

Result := FALSE;

//打开OLE/DCOM文件,返回的DLL或OCX句柄

hLibraryHandle := LoadLibrary(PCHAR(strOleFileName));

if (hLibraryHandle > 0) then//DLL或OCX句柄正确

try

//返回注册或卸载函数的指针

if (OleAction = RegisterOle) then//返回注册函数的指针

hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllRegisterServer'))

else//返回卸载函数的指针

hFunctionAddress := GetProcAddress(hLibraryHandle, pchar('DllUnregisterServer'));

if (hFunctionAddress <> NIL) then//注册或卸载函数存在

begin

RegFunction := TOleRegisterFunction(hFunctionAddress);//获取操作函数的指针

if RegFunction >= 0 then //执行注册或卸载操作,返回值>=0表示执行成功

result := true;

end;

finally

FreeLibrary(hLibraryHandle);//关闭已打开的OLE/DCOM文件

end;

end;

三、应用举例

  在我们的应用例子中,OpenDialog1(TOpenDialog)用于选择一个DLL/COM文件,editOleFileName(TEdit)用于保存DLL/COM文件名称,radiogroupOleAction(TRadioGroup)用于选择操作类型(0-卸载、1-注册),memo1(TMemo)用来显示操作成功或失败的信息。具体的例子还是看程序源码吧。

//选择一个DLL/COM文件

procedure TForm1.Button2Click(Sender: TObject);

begin

if OpenDialog1.execute then //指定一个DLL/COM文件

editOleFileName.text := OpenDialog1.FileName ;

end;

//注册一个DLL形式或OCX形式的OLE/COM控件

procedure TForm1.Button1Click(Sender: TObject);

begin

if editOleFileName.text = '' then exit;//没有指定文件名则不予处理

if RegisterOleFile( editOleFileName.text, radiogroupOleAction.ItemIndex )

then//操作成功

memo1.lines.add( DatetimeToStr( now ) + '----'+ editOleFileName.text

+ radiogroupOleAction.Items[ radiogroupOleAction.ItemIndex ] + '成功!' )

else//操作失败

memo1.lines.add( DatetimeToStr( now ) + '----'+ editOleFileName.text

+ radiogroupOleAction.Items[ radiogroupOleAction.ItemIndex ] + '失败!' );

end;

  把注册OLE/COM控件功能作成一个OLE/COM或一般的DLL供其它程序调用,可以使其它应用程序也具有注册OLE/COM控件的功能。

注册COM的更多相关文章

  1. 用php做注册审核

    做注册审核就像前面讲的注册登录一样,也是要连接数据库 首先在数据库内要做这样一张表: 表名为users表 里面的列名分别为用户名,密码,姓名,性别,生日,账户的状态,照片 然后就可以写代码了,要注册的 ...

  2. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

  3. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  4. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  5. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  6. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  7. web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)

    这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...

  8. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  10. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

随机推荐

  1. script 标签的defer,async的作用,及拓展浏览器多线程,DOMContentLoaded

    前端优化有一点就是优化js的执行时机,一般做法是将script放置于body的结束标签,以避免加载执行js 文件导致页面渲染阻塞的问题这种做法确实能防止页面阻塞,但是在页面渲染完成之后才去加载js文件 ...

  2. asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文

    近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...

  3. 【Active入门-2】ActiveMQ学习-生产者与消费者

    1个生产者,1个消费者,使用Queue: 方式1: 生产者将消息发送到Queue中,退出: 然后运行消费者: . 可以看到,可以接收到消息. 方式2: 先运行消费者程序: 然后运行生产者: 消费者见下 ...

  4. 【Oracle学习笔记-5--】集合操作之union,intersect和minus操作

    --union并操作 select e.employee_id,e.last_name from hr.employees e where e.last_name like 'C%' union se ...

  5. Kubernetes集群安全配置案例

    Kubernetes 系统提供了三种认证方式:CA 认证.Token 认证 和 Base 认证.安全功能是一把双刃剑,它保护系统不被攻击,但是也带来额外的性能损耗.集群内的各组件访问 API Serv ...

  6. appium出现的问题记录

    1,(自带的)启动模拟器提示 Starting emulator for AVD 'AVD_for_Galaxy_Nexus' emulator: ERROR: x86 emulation curre ...

  7. Fragment之介绍(转)

    http://www.cnblogs.com/plokmju/p/3239265.html 前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示 ...

  8. Redis等缓存数据库为什么访问会比较快?

    首先,我们知道,mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的 memcached(简称mc).首先,用户访问mc,如果未命 ...

  9. Scrapy爬取人人网

    Scrapy发送Post请求 防止爬虫被反主要有以下几个策略 动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 禁用Cookies(也就是不启用cookies m ...

  10. python中for...if...构建List

    1.简单的for...[if]...语句 >>> a=[12, 3, 4, 6, 7, 13, 21] >>> newList = [x for x in a] & ...