如题。
解决方案 »
- 请教:各位大哥这样的函数要怎么写?谢谢!
- 求助:请问各位大侠,delphi里面有没有像VB里面SPACE函数一样的函数?
- 你正在使用的第三方组件有哪些,最好说出理由和优点,给DELPHIFANS推荐几个!高手进,
- 关于网络组件TNMFTP、TNMHTTP、TNMUDP、TNMPOP3、TNMSTMP的一个问题。
- /**********************急!Interbase 的默认DBA密码是什么?*************************/
- 高分求解,关于模糊查询的问题...........like '%'
- 如何判断程序是开机自动运行的,还是用户双击运行的?
- 邮件问题?
- 那为大侠了解delphi6.0dbexpress控件组,如果知道给几贴。
- 一个常见的功能,不过我不会做,请进来看看吧民。
- 对一类控件进行操作,如:对10个EDIT控件进行赋值操作。
- 关于sql查询的问题!
一、注册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;constRegisterOle = 1;//注册UnRegisterOle = 0;//卸载typeTOleRegisterFunction = function : HResult;//注册或卸载函数的原型varhLibraryHandle : THandle;//由LoadLibrary返回的DLL或OCX句柄hFunctionAddress: TFarProc;//DLL或OCX中的函数句柄,由GetProcAddress返回RegFunction : TOleRegisterFunction;//注册或卸载函数指针beginResult := 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//注册或卸载函数存在beginRegFunction := TOleRegisterFunction(hFunctionAddress);//获取操作函数的指针if RegFunction >= 0 then //执行注册或卸载操作,返回值>=0表示执行成功result := true;end;finallyFreeLibrary(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);beginif OpenDialog1.execute then //指定一个DLL/COM文件editOleFileName.text := OpenDialog1.FileName ;end;
//注册一个DLL形式或OCX形式的OLE/COM控件procedure TForm1.Button1Click(Sender: TObject);beginif 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控件的功能。
源码如下:type
TForm1 = class(TForm)
Button2: TButton;
Edit1: TEdit;
......function RegisterActiveX(const FileName: string;Unregister:Boolean): Boolean;
var
SystemDir: string; 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;
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;
if Unregister then
Result := CreateProcess(PChar(SystemDir + 'RegSvr32.exe'),
PChar(' /s /u "' + FileName + '"'),
nil, nil, False, 0, nil, nil, si, pi)
else
Result := CreateProcess(PChar(SystemDir + 'RegSvr32.exe'),
PChar(' /s "' + FileName + '"'),
nil, nil, False, 0, nil, nil, si, pi); end;
begin
SystemDir := NormalDir(GetSystemDir);
if FileExists(FileName) then
Result := RegisterIt(FileName)
else
Result := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
RegisterActiveX(Edit1.text,False);
end;
end.请加分,我一直在用!