如何用程序注册OCX? ShellExecute(handle, 'Open', 'RegSvr32.exe', 'your ocx file here', nil, SW_SHOW); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这只是调用外部EXE来注册呀,会有提示信息的.. . 来自wangfajun.163.net.在DELPHI程序中注册OLE/COM控件 在用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控件的功能。 以上程序在PWIN98+DELPHI3.0下调试通过。(作者:深圳王发军 [email protected] http://wangfajun.163.net) Delphi的例子中有这方面的源代码,在.....\Demos\Activex\Tregsvr下,建议看看 delphi2007以上版本编译出来的程序都需要.net环境才能运行吗 fastreport3打印时标题上都有FastReport Unregistered version字样,如何去掉,高分(100)求助 问一个简单的问题: 请教一电子邮件的附件解决方案 帮忙写如下要求的一个Oralce的过程,会Oracle的进来看看。急! 散分!C/S,interbase5.5中,如何向数据库表追加数据? delphi & sqlserver 求救,非阻塞长连接怎么通过流发送数据呀 : sddlfz(小不点) ???,你在哪里,偶是牛虻 笔记1 有礼了。需不需要释放句炳? 请帮助想个提高处理速度的办法!
在用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控件的功能。
以上程序在PWIN98+DELPHI3.0下调试通过。
(作者:深圳王发军 [email protected] http://wangfajun.163.net)