当用户没有足够的权限时,隐藏COM-Server OLE错误消息

我正在使用COM自动化界面升级一个Delphi软件项目,以简化一些批处理任务(通过WSH-Scripting)。 这本身很容易…但是,软件的大多数“实际”用户不需要(或者甚至不知道)这个接口,并且我想让他们注册COM-Server或者错误信息当程序无法启动com服务器时(当前软件没有安装程序 – 它只是复制和去除,注册任何东西都是用户的一个额外的步骤,它是inhouse,所以客户端是习惯的。 ..)。

这里是实际的问题:我可以通过编程的方式find运行软件的当前用户是否有足够的权限来注册COM服务器,然后(如果没有)避免尝试创build服务器? 我想要一个行为,当用户没有足够的权利,自动化服务器只是没有(没有错误信息)。

我试着添加一个围绕TAutoObjectFactory.Create(...)的try-catch,但是这并不能防止错误。 添加一个启用服务器的命令行参数也不起作用,因为从脚本创build自动化对象将启动没有该参数的程序,因此也不会创build服务器。

为了解决这个问题,我使用了一个从TAutoObjectFactory继承的TMyAutoObjectFactory对象,并用一个无声的try / except子句重写UpdateRegistry方法,并更新底部的初始化部分来使用它。 喜欢这个:

 type TMyAutoObjectFactory=class(TAutoObjectFactory) public procedure UpdateRegistry(Register: Boolean); override; end; { TMyAutoObjectFactory } procedure TMyAutoObjectFactory.UpdateRegistry(Register: Boolean); begin try inherited; except //silent end; end; initialization TMyAutoObjectFactory.Create(Comserver, TMyObjectSomething, Class_MyObjectSomething, ciMultiInstance, tmApartment); end. 

这样可以消除错误,但是您仍然需要使用管理权限运行应用程序,或者让安装程序添加所需的注册表项。

我通过将Delphis的comserv-unit复制到项目中,并在Comserver.Initialize -method( Comserver.Initialize )周围放置一个try-except块来解决这个问题,因为事实证明这里发生了异常(而不是在注册TAutoObjectFactory ) :

 PROCEDURE TComserver.Initialize; BEGIN TRY TRY UpdateRegistry(FStartMode <> smUnregserver); EXCEPT ON E: EOleRegistrationError DO // User may not have write access to the registry. // Squelch the exception unless we were explicitly told to register. IF FStartMode = smRegserver THEN RAISE; END; IF FStartMode IN [smRegserver, smUnregserver] THEN Halt; ComClassManager.ForEachFactory(Self, FactoryRegisterClassObject); EXCEPT ELSE FStartSuspended := true; END; END; 

注意:只有外面的try-block是我的; 剩下的就是Delphi5(!)附带的原文。 这似乎抑制了错误(之前有人问:是的,我知道服务器没有运行,但是这是所需的结果;至少程序启动 – 我不明白为什么整个程序无法启动,如果服务器不能注册)。

PS:我没有把这个设置为接受的答案,因为它“感觉”太像一个黑客,因为它留下了一半初始化的Comserver,我不知道这是否会有任何副作用…