再问个问题!客户端的注册,总有多少种方法?(300分)

  • 主题发起人 主题发起人 dedema
  • 开始时间 开始时间
D

dedema

Unregistered / Unconfirmed
GUEST, unregistred user!
各是什么的?它们能保证有效吗?
 
还可能有几种,就一种都累死人了。
您想注册什么?
 
没人气,看来,得自己总结啦。
 
自己提自己提!
 
通过regsvr32也可以或者Borland的TREGSVR,或者程序调用dllregisterserver,你要注册什么???
 
帮你一下
up
 
谢谢你们的UP啦!
 
你要注册什么????
 
如果注册ActiveFrom 的组件,那你在发布这个组件前,先做个证书签名,每次的版本号都
需要更新,这样在客户打开这个页面组件时,就会自动提示注册。
如果是工程的形式,在做安装的时候,把要用到的附件注册到注册表中去。
这两种是不需要人为的去注册要注册的文件。
其它的上面也说了
 
可能是我神经过敏了。我的方法有效,但是出现了其它的毛病,
误以为方法失效了。
请请继续说,包括API的调用注册。
 
api调用 注册 。
dllregisterserver
 
能用就行了,等着你的分呢!!!
早点收贴。
 
转一贴~~~~:)
一、注册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控件的功能。
 
一个按钮,一个Memo,然后
在按钮中写下:
var typelib:itypelib;
opendlg:topendialog;
begin
opendlg:=topendialog.Create(self);
opendlg.Filter:='*.tlb|*.tlb|所有文件|*';
opendlg.options:=opendlg.Options+[ofAllowmultiselect];
if opendlg.Execute then
begin
memo1.Clear ;
while opendlg.Files.Count>0do
begin
loadtypelib(pwidechar(widestring(opendlg.Files[0])),typelib);
registertypelib(typelib,pwidechar(widestring(opendlg.Files[0])),nil);
memo1.Lines.Add(widestring(opendlg.Files[0]));
opendlg.Files.Delete(0);
end;
end;
opendlg.Free ;
end;
我自己制造一个特别方便的。uses ActiveX;
 
“多少种方法?”,恕我冒昧,我觉得这是一个没有具体答案的问题。因为事实上COM的注册
方法只有一种。不管COM的调用者是谁。
COM规范规定了COM必须实现DllGetClassObject引出函数,该函数的作用即在于得到COM类厂
对象的指针,然后再通过COM类厂指针来调用CreateInstance函数来生成具体
的COM对象,并把该COM对象的默认接口指针传递给调用者,然后调用者就可以根据这个接口
来调用相应的接口函数或者通过QueryInterface函数来得到其他的接口指针。
之所以看到诸如regsvr.exe或者其他的注册方法,只不过是不同的厂商实现方式而已。明白
了这个实现原理,无论是调用别人的注册方法还是自己写注册过程都是一样的道理。
 
后退
顶部