我正在升级一个带有COM自动化接口的Delphi软件项目,以简化一些批处理任务(通过WSH脚本)。这本身就很简单。然而,软件的大多数“实际”用户并不需要(甚至不知道)这个接口,我想让他们省去注册COM-Server或当程序不能启动com服务器时弹出的错误消息(目前软件没有安装程序-它只是复制和运行)。注册任何东西对用户来说都是一个额外的步骤。它是内部的,所以客户已经习惯了...)。
这是一个实际的问题:我是否可以通过编程方式找出运行该软件的当前用户是否有足够的权限注册COM服务器,然后(如果没有)避免尝试创建服务器?我喜欢这样的行为,当用户没有足够的权限时,自动化服务器就不在那里(没有错误消息)。
我尝试在TAutoObjectFactory.Create(...)周围添加一个try-catch,但这并不能防止出现错误。添加启用服务器的命令行参数也不起作用,因为从脚本创建自动化对象将在没有该参数的情况下启动程序,因此也不会创建服务器。
发布于 2014-06-19 19:20:23
为了解决这个问题,我使用了一个继承自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.这将使错误消失,但您仍需要使用管理权限运行应用程序一次,或者让安装程序添加所需的注册表项。
发布于 2014-06-24 14:59:49
我解决这个问题的方法是将Delphis comserv--method复制到项目中,并在Comserver.Initialize-method(-body)周围放置一个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;注意:只有outter try-block是我的;其余的是Delphi5(!)附带的原始代码。这似乎抑制了错误(在任何人问之前:是的,我知道服务器没有运行,但这是预期的结果;至少程序启动了-我不明白为什么如果服务器不能注册,整个程序就无法启动)。
PS:我没有将这个设置为可接受的答案,因为它“感觉”太像黑客了,因为它留下了一个半初始化的ComServer,我不知道这是否会有任何副作用……
https://stackoverflow.com/questions/24303475
复制相似问题