COM+组件客户端程序的发布问题——搜索不少旧贴,但没有得到足够的解决方案(200分)

S

Sachow

Unregistered / Unconfirmed
GUEST, unregistred user!
情况描述:服务器程序是用COM+(通过向导建立的Transaction DataModule项目,并通过
“Install COM+ Objects”菜单安装到COM+中)
几个疑惑:
1、将该组件导出为代理,安装到Win98客户机中,运行正常(该机未安装Borland开发工具,
随程序发布了Midas.dll)。但相同的方法,用于Win2000和WinXP的客户机时却失败,客户端
程序运行时报“No Server Available”,并且那两台客户机都已经是安装了C++ Builder 6的。
2、在本机(服务器)上运行DCOMCnfg时,找到组件的名称,选择其属性时,发现该组件的
应用程序类型是远程服务器,而不像其它的组件那样是本地服务器,从而不能设置安全性、
身份标识等特性,怎么会是这样呢?怎么才能把它设为本地服务器?
 
原来我的服务器端有一个TSimpleObjectBroker,现在我把它删了,出错的错误提示就变了
个样,成为了熟悉的“Interface not supported”。在服务器端我的组件实际上已经启动
了,但客户端缺乏访问的权限。我在DCOMCnfg中把该组件的身份验证级别认为“无”,并且
把“默认访问权限”、“默认启动权限”、“默认配置权限”里都加了“EveryOne”用户,
应该说一切安全设置都解除了吧?但客户端还是报同样的错。(我指的客户端是Win2000和
WinXP下的)
 
情况相同。不过我试的结果是有的客户端(win2000)可以运行有的不行。win98情况相同。
关注!
 
可能是BCB的BUG,你看一下文件mtshlpr.cpp,把和COM+相关的注册内容注释后,试试。
我这儿用了修改后的文件,一点问题也没有。
 
对不起,我搞错了,在Delphi中,不需修改任何东西,没问题的。
 
能具体讲一下你的三层是如何做的吗,也许我能帮你
 
在Delphi中,不需修改任何东西,没问题的
 
折腾了好几天,还是没有解决。什么问题都出过了,最近的是“不能创建终节点”。将COM+对
象导出为代理安装在一台Win2000 Advanced Server上,再在那台机器上建立一个新的项目,
用TDCOMConnection测试连接本机上的COM+对象时,其ServerName下拉框里竟然不显示任何
内容,难道在该机上用DCOM协议根本都连不通?
如果客户端使用DCOM(或将COM+分布出去)那么麻烦,客户端要装这装那,并且要配置这配
置那的(不是指的服务器端配置),这还能叫做瘦客户端吗?
无奈,现在只好另起炉灶,用ASP来做调用核心组件的外壳,用游览器来实现疲客户端,但
这又要多花几天的时间……。急盼解决过COM+客户端程序分发问题的侠士前来指点迷经。
 
你将COM+对象导出为应用服务器后安装,其ServerName下拉框里应该能显示内容
 
现在是要让客户机能够访问服务器上的COM+组件,而不是让每一台客户机都安装上此组件,
因此不能导出为应用服务器,只有导出为代理。
为了实现瘦客户端,尽量要做到客户端免配置、免维护。而服务器端为了实现高效地调用,
需要做成COM+组件,并且是进程内组件的形式。
现在令人大惑不解的就是为什么导到有的机器上可用,有的又不可用。
(程序是用C++ Builder开发的,但应该不是开发工具的问题,CB可是比Delphi后出的啊)
 
如果用BCB,那么就按我说的修改mtshlpr.cpp,保你成功。因为我也是用BCB的。
我们的软件都用修改后的这个文件。
 
还应注意,导出代理时的安装包,不能用来开发,只能用来作系统完成后的分发。
要想开发,必须安装导出的应用服务器包。不信可在本机上试试,一样的道理。
 
你是说该文件中凡是“case COMPLUS”的地方都注释掉吗?这样做会有负作用吗?能否解释
一下?
 
经过我们的侦测,是BCB对COM+支持问题,应该是BCB的BUG。不知BCB6如何?
代码:
#include <windows.h>
#include <sysutils.hpp>
#include "mtshlpr.h"
//#include "mtshlpr.rh"
//由于在系统中无法找到mtshlpr.rh文件所以把它注解掉,
//同时在下面重新定义该文件要用到的三个标识符,以便于编译能够正常进行。
#define sInitMTSServicesError 14
#define sLoadMTSServicesError 15
#define sLocateMTSServicesError 15
//
#pragma resource "mtshlpr.res"
#define COMPLUS 0
#define MTS 1
#define NOTSUPPORTED 1000
#undef GetObjectContext
TMtsDll::TMtsDll()
{
// bool init = init_com();
// if (!init) { init = init_mts();
}
//原来为先初始化COM+如果不成功再尝试初始化MTS,
//现改为直接初始化MTS,如果不成功则报错。
bool init = init_mts();
if (!init) { throw Exception(LoadStr(sInitMTSServicesError));
}
}
 
我现在用的就是BCB6。
我刚才大概地读了一下mtshlpr.cpp文件。采用你介绍的处理方式,是直接调用MTS的库,这
样子会不会损失掉COM+比MTS强出的功能?这样确实是一个折中的方法,但能不能从init_com
和其它函数中进行一些修改,以更好地解决此问题呢?
另外,在该文件及其引用的头文件中,确实没有那三个常量定义,但为什么在编译的时候什么
都不报呢?奇怪。
 
你说的很对,的确是降级使用,如果要修改init_com,可能对我来说力所不及了:)。
三个常量,只是定义的常数,为了返回非系统提示信息,这可说明此文件已不是系统文件而已。
 
留个E-Mail吧,过后好联系。
 
jane199991@371.net
我现在需要Dev Express的组件for BCB,包括原代码。如果有机会找到的话,
别忘了通知一声呀。
 
我很少用第三方的控件,对这方面还真不在行。
谢谢你的解答!
 
接受答案了.
 
顶部