首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用户没有足够的权限时隐藏COM-Server OLE错误消息

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

Stack Overflow用户
提问于 2014-06-19 17:40:35
回答 2查看 154关注 0票数 2

我正在升级一个带有COM自动化接口的Delphi软件项目,以简化一些批处理任务(通过WSH脚本)。这本身就很简单。然而,软件的大多数“实际”用户并不需要(甚至不知道)这个接口,我想让他们省去注册COM-Server或当程序不能启动com服务器时弹出的错误消息(目前软件没有安装程序-它只是复制和运行)。注册任何东西对用户来说都是一个额外的步骤。它是内部的,所以客户已经习惯了...)。

这是一个实际的问题:我是否可以通过编程方式找出运行该软件的当前用户是否有足够的权限注册COM服务器,然后(如果没有)避免尝试创建服务器?我喜欢这样的行为,当用户没有足够的权限时,自动化服务器就不在那里(没有错误消息)。

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

EN

回答 2

Stack Overflow用户

发布于 2014-06-19 19:20:23

为了解决这个问题,我使用了一个继承自TAutoObjectFactoryTMyAutoObjectFactory对象,它只是用一个静默的try/except子句覆盖了UpdateRegistry方法,并更新了底部的初始化部分以使用它。如下所示:

代码语言:javascript
复制
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.

这将使错误消失,但您仍需要使用管理权限运行应用程序一次,或者让安装程序添加所需的注册表项。

票数 1
EN

Stack Overflow用户

发布于 2014-06-24 14:59:49

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

代码语言:javascript
复制
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;

注意:只有outter try-block是我的;其余的是Delphi5(!)附带的原始代码。这似乎抑制了错误(在任何人问之前:是的,我知道服务器没有运行,但这是预期的结果;至少程序启动了-我不明白为什么如果服务器不能注册,整个程序就无法启动)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24303475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档