运行时自动注册ActiveX控件

来自交大bbs
发信人: maomaony (毛毛), 信区: Visual
标  题: 运行时自动注册ActiveX控件
发信站: 交通大学思源BBS (Mon Mar  6 19:44:42 2000), 转信
让Delphi应用程序在运行时自动注册ActiveX控件
Flier@stu.ccnu.edu.cn
在使用Delphi或VB等可视化编程语言制作程序时,常常会用到大量的ActiveX控件(后缀
为OCX的控件或后缀为DLL的类型库),他们为应用程序的开发提供了简便的途径。但是
这些ActiveX控件在应用程序发布后,在用户的计算机上必须进行注册。用现有的安装程
序制作软件虽然可以很好地解决这个问题,但这样做的代价往往太大,一个安装程序本
身就有几十甚至几百KB,造成程序发行版本臃肿不堪。而且每次系统重装时都必须重新
安装一遍,如果直接把安装后程序复制到其它机器上也无法直接运行。
其实我们可以通过在程序中加入特殊的处理代码很简单地解决这个问题。
一般我们使用一个ActiveX的方法分为两种:一种是直接把可视化的ActiveX控件放到程
序中;另一种是在运行时根据需要实时建立。
如果是直接使用,则应用程序在初始化的过程中会自动寻找、创建所需的ActiveX控件,
如果控件没有注册,初始化程序会产生一个异常,我们只需要捕捉这个异常并处理之即
可。
在程序主Form中加入一个新的方法(Delphi 5中可以直接使用ApplicationEvents)
TfrmMain = class(TForm)

protected
procedure MyException(Sender: TObject; E: Exception);

procedure TfrmMain.MyException(Sender: TObject; E: Exception);
begin

if E is EOleSysError then
begin
   if HRESULT(EOLESysError(E).ErrorCode) = REGDB_E_CLASSNOTREG then
     RegisterOcx;
end
else
   Application.ShowException(E);

end;
并将此方法赋值给系统Application变量,在主Form的OnCreate事件里加入一行
procedure TfrmMain.FormCreate(Sender: TObject);
begin

Application.OnException := MyException;

end;
Application是一个系统自动建立的变量,他管理着整个应用程序,他的OnException属
性所指向的方法可以替换缺省的异常处理。我们在这里建立了自己的异常处理方法,其
中对异常类的检测“if E is EOleSysError then”确认是否是对ActiveX控件操作产生
的异常, 代码“if HRESULT(EOLESysError(E).ErrorCode) = REGDB_E_CLASSNOTREG t
hen” 再进一步检测看看ActiveX控件是否是因为没有注册而出现错误,如果是,则注册
之。RegisterOcx是一个自定义的方法,我们等一会再讨论他。这里的EOLESysError.Er
rorCode是一个HRESULT类型属性,他保存着对ActiveX控件操作发生错误的错误代码,详
细信息请查阅帮助或MSDN资料。
如果是在运行时动态建立ActiveX控件,则直接处理建立时的异常即可,如

try
   DemoOcx := CreateOleObject(‘Demo.Demo’);
except
   on E:EOleSysError do
   if HRESULT(E.ErrorCode) = CO_E_CLASSSTRING then
   begin
     if RegisterOcx then
       DemoOcx := CreateOleObject(‘Demo.Demo’);
     else
     begin
       MessageDlg('控件注册失败,程序无法正常使用!', mtError, [mbAbort], 0)
;
       Application.Terminate;
     end;
   end
   else
     raise;

注意这里我是使用的按名字(ProgramID)创建的方法,因此Delphi首先调用了一次CLSID
FromProgID函数,把ProgramID转换成相应的ClassID,所以这里产生的异常不是类未注
册(REGDB_E_CLASSNOTREG),而是类名称字符串错误(CO_E_CLASSSTRING)。如果要使
用别的创建方法,可以按这个思路改变检测ErrorCode的不同值……
至此我们已经可以捕捉到所有的因为类未注册而产生的异常,然后我们来处理他:

const
OCX_FILENAME = ‘demo.ocx’;

function TfrmMain.RegisterOcx: Boolean;
var
SystemDir: string;
function RegisterIt(const FileName: string): Boolean;
var
   si: TStartupInfo;
   pi: TProcessInformation;
begin
   FillChar(si, SizeOf(si), 0);
   with si do
   begin
     cb          := SizeOf(si);
     wShowWindow := SW_HIDE;
     dwFlags     := STARTF_USESHOWWINDOW;
   end;
   Result := CreateProcess(PChar(SystemDir + 'RegSvr32.exe'),
                           PChar(' /s "' + FileName + '"'),
                           nil, nil, False, 0, nil, nil, si, pi);
end;
begin
SystemDir   := NormalDir(GetSystemDir);
if FileExists(OCX_FILENAME) then
   Result := RegisterIt(NormalDir(ExtractFilePath(ParamStr(0))) + OCX_FILEN
AME)
else if FileExists(SystemDir + OCX_FILENAME) then
   Result := RegisterIt(SystemDir + OCX_FILENAME)
else
with dlgOpenOCX do
begin
   InitialDir := SystemDir;
   FileName   := OCX_FILENAME;
   if Execute then
     Result := RegisterIt(FileName)
   else
     Result := False;
end;
end;
首先取得系统目录(/windows/system)的路径到SystemDir变量(这里用到了NormalDir和
GetSystemDir两个函数是从RXLib控件包里摘抄下来的,见后面附带的代码),然后检测
在当前目录,系统目录下是否存在需要注册的控件,如果没有找到则要求用户指定其存
放的位置(dlgOpenOCX是一个TopenDialog),如果找到了或者用户指定了,则调用子函
数RegisterIt注册之。
注册ActiveX控件可以使用Windows自带的一个注册工具RegSvr32.exe,他在Windows的系
统目录里可以找到,我们给他“/s”参数让他不产生注册成功信息,而且通过修改Tsta
rtupInfo内容让其在后台运行即不显示DOS Box。(其实RegSvr32也是直接调用OCX控件
的一个DllRegisterServer函数注册控件的)。至此,整个ActiveX自动注册机制已经完
成,你可以放心地发布带有ActiveX控件的应用程序了。
所有代码在NT 4.0SP6、Delphi 4和5下调试通过
附:GetSystemDir和NormalDir函数的代码
function NormalDir(const DirName: string): string;
begin
Result := DirName;
if (Result <> '') and not (Result[Length(Result)] in [':', '\']) then
begin
   if (Length(Result) = 1) and (UpCase(Result[1]) in ['A'..'Z']) then
     Result := Result + ':\'
   else
     Result := Result + '\';
end;
end;
function GetSystemDir: string;
var
Buffer: array[0..1023] of Char;
begin
SetString(Result, Buffer, GetSystemDirectory(Buffer, SizeOf(Buffer)));
end;

 

调用OCX中DllRegisterServer即可。
先用LoadLibrary,后使用GetProcAddress得到DllRegisterServer地址,运行他
就可以了

//已经测试通过
type
TDllRegisterServer=function:HResult; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
Ocx:TDllRegisterServer;
H:THandle;
begin
H:=LoadLibrary('MsComm32.Ocx');
try
   @Ocx:=GetProcAddress(H,'DllRegisterServer');
   Ocx;
finally
   FreeLibrary(H);
end;

转载于:https://www.cnblogs.com/railgunman/archive/2010/11/21/1883468.html

大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父” 原标题:BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”BIM研究的先驱、佐治亚理工教授Charles (Chuck) M. Eastman于本周一(11月9日)在其Atlanta家中逝世。特转韩国Yonsei大学Ghang Lee教授的讣文以作纪念。过世原因未说明。BIM的出现是与当今代科技的发展分不开的。在信息代建筑发展面临的挑战巨大:建筑物越建越高... 阅读详情

相关推荐

Ollama内网离线部署大模型实战:从模型文件到私有化服务

本文详细介绍了如何在内网离线环境下,利用Ollama部署私有化大模型服务。内容涵盖从获取GGUF格式模型文件、手动安装Ollama、编写核心Modelfile配置文件,到创建运行模型、性能调优及安全加固的全流程实战指南,旨在帮助企业安全、可控地构建内部AI能力。

weixin_29209805的博客 187

Delphi 使用代码-注册与反注册DLL

Delphi 使用代码-注册与反注册DLL unit DLLMain; interface uses windows,sysutils; (*注册*) function DLLReg(const FileName:PChar):Boolean;export;stdcall; (*反注册*) function DLLUnReg(const FileName:PChar):Boolean;export;stdcall; type DLLRegProc=function :HResul

mark885的博客 636

计算机毕设项目十四:美团酒店评论情感分析完整数据代码-可直接运行

计算机毕设项目十四:美团酒店评论情感分析完整数据代码-可直接运行

671

delphi下的COM编程

组件对象模型(Component Object Model,以下简称COM)是组件对象之间相互接口的规范,凡是遵循COM接口规范的对象彼此之间能相互通信和交互,即使这些对象是由不同的厂商、用不同的语言、在不同的Windows版本甚至不同的机器上编写和建立的。Delphi支持COM

wangpeng2011314的专栏 1583

注册ActiveX控件的几种方法.txt

    使用ActiveX控件可快速实现小型的组件重用、代码共享,从而提高编程效率,降低开发成本。但是ActiveX控件对于最终用户并不能直接使用,因为ActiveX控件必须先在Windows中注册注册ActiveX控件一般来说有六种途径,它们有各自的优点,运用范围也不同。  Regsvr32.exe注册   Regsvr32.exe位于Windows目录的system子目录下。点击Wi

郑成的博客 1826

在程序运行自动注册ActiveX控件

 编写Delphi应用程序,经常会遇到一些ActiveX控件[注:扩展名为OCX的控件或DLL的类型库],它们为应用程序的开发提供了简单的操作途径。然而,这些程序在发布的同,面临ActiveX控件注册问题。   解决途径:一、用安装程序制作打包文件,往往会给增加程序本身的大小,系统重装,则必须重新安装它;二、用程序本身进行代码编写函数的形式处理它。   使用方法分为两种:   一、直接...

weixin_30552635的博客 411

如何使程序在运行自动注册ActiveX控件

如何使程序在运行自动注册ActiveX控件编写Delphi应用程序,经常会遇到一些ActiveX控件[注:扩展名为OCX的控件或DLL的类型库],它们为应用程序的开发提供了简单的操作途径。然而,这些程序在发布的同,面临ActiveX控件注册问题。 解决途径:一、用安装程序制作打包文件,往往会给增加程序本身的大小,系统重装,则必须重新安装它;二、用程序本身进行代码编写函数的形式处理它。 使用

hai_zi的专栏 1016

Delphi的笔记整理(一)

这几天清理资料,把以前学Delphi的笔记翻出来了。大概是2005年的吧,有些资料都没有什么价值了。以后再整理吧。   Delphi Note 1、触发器的使用。 源数据库: 名称:info 字段:idd、namee、age、sex、city、department、position 目标数据库: 名称:leave 字段:idd、namee、type 1、 修改操

diligentcat的专栏 9027

activex注册和反注册工具(win自带)

坚持,才是力量.老实做人,踏实做事. 884

ActiveX控件注册的几种方法

-----ActiveX控件是一个动 态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件。由于ActiveX控件与 开发平台无关,因此,在一种编程语言上开发的ActiveX控件可以无须作任何修改,即可在另一种编程语言中使用,其效果如同使用Windows通用控件 一样。如:在VC++中开发的ActiveX控件,不作任何修改即可应用...

weixin_34283445的博客 1687

Raid-1安装Ubuntu 24.04 LTS

3、对两块盘(220d57ef 和 86cee0d6 )做通样的操作,选择Use As Boot Device(启动设备)4、对两块盘(220d57ef 和 86cee0d6 )做通样的操作,Add GPT Partition。1、进入安装操作系统的磁盘,空格键选择 Custom storage layout。选择Leave unformatted。2、我是两个25G的盘。

weixin_63168851的博客 24

用友U8科目错误修正工具(用友U8总账明细账不平修复工具)v1.0中文免费绿色版

用友U8科目错误修正工具主要用于修改结账总账和细节帐不平不能结账的问题,之前是无法解决的,现在有了这款软件就可以轻松修改了,非常实用。从事会计的朋友可以下载试试,可以大大提高工作效率哦使用方法:需要修改的套账年度,科目编码 ,月份 点击修正科目用友U8使用技巧1、如何快速选取特定区域?使用F5键可以快速选取特定区域。例如,要选取A2:A1000,最简便的方法是按F5键,出

Ultra Fractal(分形艺术软件)官方正式版32位V6.04 | 含ultra fractal教程

Ultra Fractal 6 是一款优秀且易于使用的专业电脑分形艺术软件,无需任何数学基础就可以从数以千计的分形类型和着色算法中进行选择,根据需要进行放大,使用渐变添加颜色,并应用多个图层以将不同的分形组合在一张图像中,图像导入功能在分形中导入 PNG、JPEG 或 BMP 图像,只需选择包含图像参数的着色算法,大家就可以选择计算机上的任何图像来使用,Ultra Fractal分形艺术软件还允许用户通过使用图层、蒙版、图层组功能到到类似PS那样的合并模式来合成分形综合性能远超其它同类分形艺术软件,此外通过内置的ultra fractal教程用户可以从基础开始,然后将很快学会如何创建自己的分形、更改颜色、添加图层、使用蒙版甚至创建分形动画,可谓是不可多得的创建分形动画的神器,如果大家还不清楚分形艺术软件哪个更好用的话,威航软件园推荐大家试试超分形艺术软件,并提供最新版本的ultra fractal下载,威航软件园微信公众号回复【Ultra Fractal】即可获取ultra fractal教程。

上一篇: MTS组件——从理论到实践
下一篇: delphi winsock 函数详解[转]
aowo7144
博客等级 码龄9年 5粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值