请问如何发布 COM+ 组件?(100分)

  • 主题发起人 主题发起人 HammerLi
  • 开始时间 开始时间
H

HammerLi

Unregistered / Unconfirmed
GUEST, unregistred user!
开发完毕的COM+组件如何发布到服务器或工作站的机器上?我问的不是通过Windows的
组件服务管理器的发布方法,而是通过自己撰写代码实现,可以是InstallShield代码。
 
没有人知道吗?还是我给的分少了?
 
在组件服务控制台里面,点你的COM+包的右键,会有一个倒出的菜单,看一眼吧!
 
找个住册表工具,看看前后异同,自己搞,
不过我觉的minikiller的方法更专业些
 
1.打开组件管理器
2.组件服务---我的电脑---COM+应用程序
3.右键-新建一个应用程序
4.在新建的应用程序里右建--新建一个COM+组件--选择你编写的DLL文件
5.导出这个组件,就成了安装包
 
minikiller的就可以
在高深的就要写注册表了,不过没研究过
 
minikiller 的方法是最简单的,我说过了“我问的不是通过Windows的组件服务管理器
的发布方法,而是通过自己撰写代码实现”,可以是通过Delphi等语言编写的执行文件
或者是用InstallShield Professional(Studio) 作发布包时的脚本文件!
 
转载:
一、注册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到COM+中以及怎么在
COM+中怎么样打包发布到其他机器上的(用程序实现)
 
使用installshield就可以,
只要将需要注册的com+组件作为自注册组件
 
多谢大家帮忙,正在试验中,不过好像ioriyashino的方法不适用于 COM+ 组件,两者的
方法应该是不一样的,否则在Delphi的Run菜单下就不会用单独的方法安装 COM+ 组件了。
我试验完后一定给大家结果,再来讨论。
 
试验中发现问题,COM+ 组件的发布与安装是要求指定套件名称的,所以ioriyashino和
windbell的方法看来还是不行,不过多谢ioriyashino的帮助,受到了意外的收获。大家
再来讨论啊!!
 
你自己先在本机上注册安装com+组件,然后在控制面版的计算机管理中的组件服务中找到你的
组件,然后在上面点鼠标右键,可以导出一个msi文件和一个cab文件,发布这两个文件,双击运行
这个msi就可以了.
 
1.打开组件管理器
2.组件服务---我的电脑---COM+应用程序
3.右键-新建一个应用程序
4.在新建的应用程序里右建--新建一个COM+组件--选择你编写的DLL文件
5.导出这个组件,就成了安装包
 
同意风花雪叶!
导出之后的包可以拿到客户的机器上直接安装。李维的书上ADO/MTS/COM+上
第9章(记不清)上有。具体的做法你可以参考。
 
李维的ADO/MTS/COM+所介绍的方法我知道,通过组件服务分发COM+组件我也会,这些都
不在本议题的范围,请看题!
 
关注,好象用TRegSvr也能注册,客户端也能连接,但却没有套件了,在组件服务的com+组件
里也看不到
 
regsvr32 ../xx.dll
 
后退
顶部