为什么TService上还没有Description属性?

9

一直以来,Delphi的VCL中的TService都没有Description属性,这一点总是让人感到奇怪。即使到了今天,Delphi XE2仍然没有这个属性。它是一个如此简单和常见的东西,我不明白为什么没有提供。

我知道如何自己创建它,但我的观点是我不应该这样做。我想知道是否有任何技术原因导致Delphi's VCL没有内置服务的Description属性?因为它看起来对他们来说非常简单。


我的猜测是技术原因是没有人决定(或想到)它是必要的,如果想获得更多信息,您需要询问Borland/CodeGear/Embarcadero。换句话说,我认为这个问题没有人能回答。 :-) 我不会投反对票或做其他任何事情,只是发表评论。 - Ken White
@Ken 我也是这么想的,但我也在考虑Windows可能有一些限制,而VCL没有考虑到,或者类似这样的情况。 - Jerry Dodge
1
为什么你在这里问一个只有Delphi团队的决策者才能回答的问题?在我看来,在开始询问“为什么X在Class/Library/Language等中(或不在)”这样的问题之前,你必须三思而后行,因为你知道只有决策者才能问“为什么”。 - jachguate
1
是的,最终这是由 Delphi 开发人员做出的决定,但我想知道是否有人知道为什么会做出这个决定。 - Jerry Dodge
1
@Remy:我猜他们认为它不像 FMX、泛型或其他更改一样优先级高,但我不知道为什么会这样。你比我更能找出原因。 :-) - Ken White
显示剩余6条评论
2个回答

10

设置它需要使用ChangeServiceConfig2 API函数,在XP和Win2003中引入,Delphi服务类在此之前编写,并且在很长一段时间内,Windows NT4和2000是Delphi RTL的基线。

此外,由于某种未知原因,Borland(及其继承者)不喜欢在Windows API函数上使用动态绑定,而更喜欢静态绑定到DLL或晚期但非可选绑定(别问我为什么,这对我毫无意义),使用先前的函数将要求将Win2003作为最低版本或使用动态绑定。

因此,我认为这不是一个故意的决定,而更多地是公司在动态绑定方面的政策以及简单老旧代码的维护忽视/疏忽导致的结果。


+1 这正是我期望听到的,不是没有人想过这样做,而是它的工作方式并不自然地支持它。 - Jerry Dodge
因此,为了使其成为可能,需要完全重写TService - Jerry Dodge
@JerryDodge,其实不用重写任何东西,只需要动态绑定函数并在可用时调用即可(如果您想保持Win2003和XP的兼容性)。这只是一点额外的代码和一个额外的属性。 - Eric Grange
我的意思是Embarcadero不会只修复这个问题,而不修复所有其他缺失的漏洞。 - Jerry Dodge

3
你可以这样使用。
procedure TMyService.ServiceAfterInstall(Sender: TService);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);

  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
    begin
      Reg.WriteString('Description', 'All details you can write to here.');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

我知道如何自己创建它,但我的观点是我不应该这样做。 - Jerry Dodge
顺便说一句,对我来说不起作用,最新的Win10,即使我看到创建了带有描述的“Description”注册表键,在服务中我只看到服务名称,描述为空。 - Nihila
@JerryDodge 如果你的整个观点是为了理解Borland/CodeGear/Embarcadero忽视这一点的原因,那么这个问题应该被移除。首先,“知道他们为什么没有引入这个属性”没有任何意义,其次,只有参与过这个过程的人才能知道真正的原因。这个答案才是应该被认为是正确的答案。 - Alexandre M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接